从数组中随机翻转 m 个值

an *_*use 2 python arrays performance numpy

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

有两种情况,m=1case是特殊情况。可以单独讨论, 和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]
Run Code Online (Sandbox Code Playgroud)

假设m有数十个和n数百个。

Div*_*kar 6

为了确保我们不会将同一个元素翻转两次甚至多次,我们可以在该长度范围内创建唯一索引,并将np.random.choice其可选replace参数设置为 False。然后,只需对输入数组进行索引并一次性翻转就可以得到所需的输出。因此,我们会有这样的实现 -

idx = np.random.choice(n,m,replace=False)
a[idx] = -a[idx]
Run Code Online (Sandbox Code Playgroud)

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