使用numpy

时间:2019-05-15 07:14:26

标签: python numpy

我创建了一个尺寸为2且形状为(43,64)的numpy数组。该阵列由2s,3s,4s和5s组成。对于阵列的每一列,我现在想交换所有3s的5%并使其为4,并且类似地,交换所有5s的5%使其为2。有可能这样做吗?

我找到了将所有3与4交换以及将所有5与2交换的解决方案,以及交换数组的第一个和最后一个元素的解决方案。但是,我没有交换一定比例的元素的起点。

我用所需的尺寸初始化数组:

import numpy as np

array = np.zeros((43, 64))

然后我创建一个循环以创建所需的数组,结果是:

[[2. 2. 2. ... 3. 5. 5.]
 [5. 5. 3. ... 2. 5. 5.]
 [4. 2. 4. ... 2. 3. 4.]
 ...
 [2. 5. 4. ... 3. 5. 5.]
 [4. 2. 3. ... 3. 5. 2.]
 [3. 3. 2. ... 3. 3. 4.]]

现在,我想选择每列,并将3s与4s交换为百分比,将5s与2s交换为百分比,但不知道该如何处理。

我希望输出数组的尺寸和以前一样,只是交换了一定数量的值,如图所示。

1 个答案:

答案 0 :(得分:2)

也许这就是您想要的:

def swap(array, n):
    indices = [i for i, x in enumerate(array) if x == n]
    for i in indices[:round(len(indices)/20)]:
        array[i] = 7-array[i]

您可以轻松地更改代码以使其对也起作用,因此不考虑已交换的元素:

def swap(array, a, b):
    a_i = [i for i, x in enumerate(array) if x == a]
    b_i = [i for i, x in enumerate(array) if x == b]
    for i in a_i[:round(len(a_i)/20)]:
        array[i] = b
    for i in b_i[:round(len(b_i)/20)]:
        array[i] = a

此示例仅更改元素的前5%(四舍五入)。如果您希望随机选择这些元素,则可以更改for循环,以便它们这样做。