Python 使用numpy交换数组中一定百分比的元素

Python 使用numpy交换数组中一定百分比的元素,python,numpy,Python,Numpy,我已经创建了一个尺寸为2,形状为(43,64)的numpy数组。阵列由2、3、4和5组成。对于数组的每一列,我现在想交换所有3的5%来生成4,同样地,交换所有5的5%来生成2。有可能这样做吗 我已经找到了用4s交换所有3s和5s到2s的解决方案,以及交换阵列的第一个和最后一个元素的解决方案。但是,我没有交换一定百分比元素的起点 我使用所需的维度初始化数组: 将numpy导入为np 数组=np.零((43,64)) 然后,我创建一个循环以生成所需的数组,结果如下: [[2. 2. 2. ...

我已经创建了一个尺寸为2,形状为(43,64)的numpy数组。阵列由2、3、4和5组成。对于数组的每一列,我现在想交换所有3的5%来生成4,同样地,交换所有5的5%来生成2。有可能这样做吗

我已经找到了用4s交换所有3s和5s到2s的解决方案,以及交换阵列的第一个和最后一个元素的解决方案。但是,我没有交换一定百分比元素的起点

我使用所需的维度初始化数组:

将numpy导入为np
数组=np.零((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.]]
现在我想选择每一列,用4s交换3s的百分比,用2s交换5s的百分比,但不知道如何处理这个问题


我希望输出数组的维数与以前相同,只是如图所示交换了一定数量的值。

也许这就是您想要的:

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循环,以便它们这样做

期望的输出在哪里?