2015-09-23 33 views
2

來排列一維數組A我知道,你可以運行下面的代碼:應用相同的置換,每行中的2D numpy的陣列

import numpy as np 
A = np.random.permutation(A) 

我有一個二維數組,並希望應用完全一樣的排列用於數組的每一行。你有什麼方法可以指定numpy爲你做這個嗎?

+0

對不起,我不太清楚。 每行應該具有與應用排列之前相同的一組元素,但是排列每行中元素的方式應該是相同的。因此,如果位置0中的元素到達位置4,則每行都應該發生相同的情況。 – jsguy

+1

換句話說,你想排列A的列? –

回答

5

生成列A中的數量和索引的A列隨機排列,像這樣 -

A[:,np.random.permutation(A.shape[1])] 

採樣運行 -

In [100]: A 
Out[100]: 
array([[3, 5, 7, 4, 7], 
     [2, 5, 2, 0, 3], 
     [1, 4, 3, 8, 8]]) 

In [101]: A[:,np.random.permutation(A.shape[1])] 
Out[101]: 
array([[7, 5, 7, 4, 3], 
     [3, 5, 2, 0, 2], 
     [8, 4, 3, 8, 1]]) 
+0

你的方法似乎在改變行的值,例如在排列之前的第一行中我們沒有2,但是在那之後我們有了2.我想要某種掩碼,例如,如果先前位於排列後的位置0的第一行的元素到達位置4,則對於第二行的位置0中的元素和所有其他行,將發生相同的情況。 – jsguy

+0

@jsguy像剛剛編輯的代碼一樣嗎? – Divakar

1

這取決於你的意思是在每一行什麼。

如果您想排列所有值(不管行和列),請將您的數組重新排列爲1d,排列,重新排列成2d。

如果你想排列每一行,但不是在不同的列之間洗牌,你需要循環通過一個軸並調用排列。

for i in range(len(A)): 
    A[i] = np.random.permutation(A[i]) 

它可能會做得更短些,但這是如何做到的。

3

其實你並不需要這樣做,從documentation

如果x是一個多維數組,它只是沿着它的第一個 指數洗牌。

所以,服用Divakar的數組:

a = np.array([ 
    [3, 5, 7, 4, 7], 
    [2, 5, 2, 0, 3], 
    [1, 4, 3, 8, 8] 
]) 

,你可以這樣做:np.random.permutation(a)和得到的東西,如:

array([[2, 5, 2, 0, 3], 
     [3, 5, 7, 4, 7], 
     [1, 4, 3, 8, 8]]) 

附:如果您需要執行列置換 - 只需執行np.random.permutation(a.T).T。類似的東西適用於多暗數組。