我创建了一个尺寸为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交换为百分比,但不知道该如何处理。
我希望输出数组的尺寸和以前一样,只是交换了一定数量的值,如图所示。
答案 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循环,以便它们这样做。