随机翻转数组中的m值

2024-05-08 03:32:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个长度为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是十,而{}是百。在


Tags: 方法importnumpyan元素asnp情况
3条回答

为了确保不会将同一元素翻转两次甚至更多次,我们可以使用^{}将其可选的replace参数设置为False,在该长度范围内创建唯一索引。然后,简单地索引到输入数组并一次性翻转就可以得到所需的输出。因此,我们会有这样的实现-

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

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

您需要将数组的索引从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)

我的输出:

^{pr2}$

您可以对数组索引进行随机排列,取其中的第一个m并翻转它们的值:

a[np.random.permutation(range(len(a)))[:m]]*=-1

使用permutation验证您不会选择同一个索引两次。在

相关问题 更多 >