[英]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.