python - 从数组中随机翻转 m 个值

标签 python arrays performance numpy

我有一个长度为 n 的数组,我想从中随机选择 m 元素并翻转它们的值。什么是最有效的方法?

有两种情况,m=1情况是特例。可以单独讨论,m=/=1

我的尝试是:

import numpy as np
n = 20
m = 5
#generate an array a
a = np.random.randint(0,2,n)*2-1
#random choose `m` element and flip it.
for i in np.random.randint(0,n,m):
    a[m]=-a[m]

假设m是十位,n是百位。

最佳答案

为了确保我们不会将同一个元素翻转两次甚至更多次,我们可以使用 np.random.choice 在该长度范围内创建唯一索引。使用其可选的 replace 参数设置为 False。然后,简单地索引输入数组并一次性翻转应该给我们想要的输出。因此,我们会有这样的实现 -

idx = np.random.choice(n,m,replace=False)
a[idx] = -a[idx]

更快的版本:对于 np.random_choice 的更快版本,我建议阅读 this post探索使用 np.argpartition 来模拟相同的行为。

关于python - 从数组中随机翻转 m 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38879244/

相关文章:

python - 在 Gunicorn 中共享内存?

Python NotImplemented 常量

java - 重新排列数组中的偶数和奇数

asp.net - 按值查找 TreeView 节点

php - 如何在PHP中批量更新插入mongodb?

python - 将列表的字符串表示形式转换为列表

python - gunicorn + flask (connexion/swagger_server) 超时/不响应 API 请求

ruby - 如何获取具有最大值属性的数组的唯一元素

arrays - 如何在 Matlab 中检查数组中 P 元素的所有组合与总 N 元素?

c - 将 char * 重新解释为用于只读操作的另一种原始类型的数组的任何合法方法?