2013-01-10 107 views
76

我有一個非常大的二維數組,這看起來是這樣的:NumPy的:獲取隨機組行從二維數組

a= 
[[a1, b1, c1], 
[a2, b2, c2], 
..., 
[an, bn, cn]] 

使用numpy的,有一個簡單的方法來獲得與例如一個新的二維數組來自初始數組a的2個隨機行(沒有替換)?

例如

b= 
[[a4, b4, c4], 
[a99, b99, c99]] 
+2

其愚蠢有一個問題一替換和一個沒有,你應該只允許這兩個答案,實際上是鼓勵兩個答案。 – Pinocchio

回答

85
>>> A = np.random.randint(5, size=(10,3)) 
>>> A 
array([[1, 3, 0], 
     [3, 2, 0], 
     [0, 2, 1], 
     [1, 1, 4], 
     [3, 2, 2], 
     [0, 1, 0], 
     [1, 3, 1], 
     [0, 4, 1], 
     [2, 4, 2], 
     [3, 3, 1]]) 
>>> idx = np.random.randint(10, size=2) 
>>> idx 
array([7, 6]) 
>>> A[idx,:] 
array([[0, 4, 1], 
     [1, 3, 1]]) 

將其組合在一起對於一般情況下:

A[np.random.randint(A.shape[0], size=2), :] 

對於非置換(numpy的1.7.0+):

A[np.random.choice(A.shape[0], 2, replace=False), :] 

我不相信有在1.7之前生成隨機列表而無需替換的好方法。也許你可以設置一個小的定義來確保兩個值不一樣。

+3

有可能不是一個好方法,但是一種和'np.random.choice'一樣好的方法,那就是'np.random.permutation(A.shape [0])[:2]',實際上它不是很好,但這就是'np.random.choice'這個時候......或者你不在意改變你的數組,'np.random.shuffle' – seberg

+1

在numpy 1.7之前,使用[隨機](http://docs.python.org/2.7/library/random.html).sample(xrange(10),2) – denis

+1

你爲什麼要命名變量A和B?它使閱讀變得更加困難。 – Pinocchio

20

這是舊的文章,但是這是最適合我:

A[np.random.choice(A.shape[0], num_rows_2_sample, replace=False)] 

變化替換=假爲真,以得到同樣的事情,但更換。

+0

@SalvadorDali我編輯了Hezi的帖子,不選擇替換。一旦編輯被同行評審,你會看到'選擇'增加了'replace = False'參數。 – 0x24a537r9

+1

@ 0x24a537r9你不應該這樣做。這是他的答案,你改變它。如果你想 - 添加你的答案,不要改變其他人的答案,這會顯着改變答案 –

+0

@ 0x24a537r9你可以發佈答案而不需要更換嗎? – ocean800

18

另一種選擇是創建一個隨機掩碼,如果您只是想按某個因子對數據進行縮減採樣。說我想下采樣到我的原始數據集,這是目前陣列data_arr舉行的25%:

# generate random boolean mask the length of data 
# use p 0.75 for False and 0.25 for True 
mask = numpy.random.choice([False, True], len(data_arr), p=[0.75, 0.25]) 

現在,您可以撥打data_arr[mask],並返回〜25%的行,隨機抽取的。

3

如果您需要在同一行,但就在這時,一個隨機抽樣,

import random 
new_array = random.sample(old_array,x) 

這裏的x,必須是一個「詮釋」定義要隨機挑選的行數。