python - 使用 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 交换百分比,但不知道如何处理。
我期望一个输出数组,具有与以前相同的维度,只是交换了一定数量的值,如图所示。
解决方案
也许这就是您正在寻找的:
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 循环,以便它们这样做。
推荐阅读
- java - Java 11:导入 javax.xml.ws.WebFault:“无法解析符号 ws”
- angular - (Angular)使用双向数据绑定与服务在组件之间共享数据
- excel - 如果工作表中有选定的范围,单元格验证将返回运行时错误 1004
- javascript - xx.xxx 的正则表达式
- go - 是什么让 http.server 使用 HTTP/2?
- c# - 如何从“%”之类的字符修剪字符串以结束C#
- windows - 如何在 Windows 中创建僵尸进程?
- javascript - 在componentDidMount()里面的两个`then`中执行函数
- typescript - VS Code 不对打字稿文件进行类型检查
- javascript - 如何根据 C3.js/D3.js 图表中的阈值更改线条颜色?