从数组中随机翻转m值

时间:2016-08-10 16:47:02

标签: 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为数百。

3 个答案:

答案 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]