我有一个长度为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
为数百。
答案 0 :(得分:4)
为了确保我们不会翻转相同的元素两次甚至更多次,我们可以使用np.random.choice
的可选replace
参数设置为False,在this post
的长度范围内创建唯一索引。然后,简单地索引到输入数组并一次性翻转应该给我们所需的输出。因此,我们会有这样的实现 -
idx = np.random.choice(n,m,replace=False)
a[idx] = -a[idx]
更快的版本:对于更快版本的np.random_choice
,我建议您阅读{{3}},了解如何使用np.argpartition
来模拟相同的行为。
答案 1 :(得分:1)
你可以对数组索引进行随机排列,取出它们的第一个m
并翻转它们的值:
a[np.random.permutation(range(len(a)))[:m]]*=-1
使用permutation
验证您不会选择相同的索引两次。
答案 2 :(得分:0)
您需要将数组的索引从m
更改为i
才能实际更改该值。
结果:
import numpy as np
n = 20
m = 5
#generate an array a
a = np.random.randint(0,2,n)*2-1
print(a)
#random choose `i` element and flip it.
for i in np.random.randint(0,n,m):
a[i] = -a[i]
print(a)
我的输出:
[ 1 1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1 1 1 1 1 -1 1 -1]
[ 1 1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 -1]