Python 使用numpy交换数组中一定百分比的元素
我已经创建了一个尺寸为2,形状为(43,64)的numpy数组。阵列由2、3、4和5组成。对于数组的每一列,我现在想交换所有3的5%来生成4,同样地,交换所有5的5%来生成2。有可能这样做吗 我已经找到了用4s交换所有3s和5s到2s的解决方案,以及交换阵列的第一个和最后一个元素的解决方案。但是,我没有交换一定百分比元素的起点 我使用所需的维度初始化数组: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. ...
将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循环,以便它们这样做 期望的输出在哪里?