簡體   English   中英

從數組中隨機翻轉m個值

[英]random flip m values from an array

我有一個長度為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模擬相同行為的文章。

您可以對數組索引進行隨機排列,取其中的前m個並翻轉其值:

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

使用permutation驗證,您不會兩次選擇相同的索引。

您需要將數組的索引從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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM