首页 > 解决方案 > 使用 numpy 交换数组中一定百分比的元素

问题描述

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

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

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

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 交换百分比,但不知道如何处理。

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

标签: pythonnumpy

解决方案


也许这就是您正在寻找的:

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


推荐阅读