2013-12-12 66 views
12

假設我有一個尺寸爲(n, m)的數組r。我想打亂那個數組的列。用Numpy隨機播放列數

如果我使用numpy.random.shuffle(r)它洗牌行。我怎樣才能洗牌?因此,第一列隨機成爲第二列,第三列等。

實施例:

輸入:

array([[ 1, 20, 100], 
     [ 2, 31, 401], 
     [ 8, 11, 108]]) 

輸出:

array([[ 20, 1, 100], 
     [ 31, 2, 401], 
     [ 11, 8, 108]]) 

回答

13

雖然詢問我考慮也許我可以洗牌轉置陣:

np.random.shuffle(np.transpose(r)) 

它看起來像做這項工作。我很感激評論,以瞭解它是否是實現這一目標的好方法。

+1

它。不過,我建議'r.T'進行轉置。 – user2357112

+1

@ user2357112與'n.transpose(r)''r.T'完全相同,但更短? –

+1

有效完全相同。一維數組有一個非常細微的差別,但是你可能不會對一維數組使用'T'或'transpose'。 – user2357112

6

對於一般的軸,你可以遵循的模式:

>>> import numpy as np 
>>> 
>>> a = np.array([[ 1, 20, 100, 4], 
...    [ 2, 31, 401, 5], 
...    [ 8, 11, 108, 6]]) 
>>> 
>>> print a[:, np.random.permutation(a.shape[1])] 
[[ 4 1 20 100] 
[ 5 2 31 401] 
[ 6 8 11 108]] 
>>> 
>>> print a[np.random.permutation(a.shape[0]), :] 
[[ 1 20 100 4] 
[ 2 31 401 5] 
[ 8 11 108 6]] 
>>> 
+0

你的第二個例子看起來不穩定...... – onewhaleid

2

所以,從你的答案又進了一步:

編輯:我很容易會被誤認爲這是如何工作的,所以我插入我對每一步矩陣狀態的理解。

r == 1 2 3 
    4 5 6 
    6 7 8 

r = np.transpose(r) 

r == 1 4 6 
    2 5 7 
    3 6 8   # Columns are now rows 

np.random.shuffle(r) 

r == 2 5 7 
    3 6 8 
    1 4 6   # Columns-as-rows are shuffled 

r = np.transpose(r) 

r == 2 3 1 
    5 6 4 
    7 8 6   # Columns are columns again, shuffled. 

然後,它將恢復正確的形狀,重新排列列。

矩陣轉置的轉置==那個矩陣,或者[A^T]^T == A.所以,在轉移之後你需要做第二次轉置(因爲轉置不是洗牌),以便它再次處於適當的形狀。

編輯:OP的答案跳過存儲換位,而是讓洗牌操作r,就像它是。

+0

'np.random.shuffle'不返回數組。 –

+0

所以我看,編輯。無論如何,最後一步是將矩陣返回到原來的形狀。 – Matt

+0

@Matt:不,不是。 'transpose'返回原始數組的視圖。一旦你洗牌轉置陣列,原來的洗牌方式。不需要轉置兩次。 – user2357112

0

一般來說,如果你想洗牌沿軸線i一個numpy的數組:

def shuffle(x, axis = 0): 
    n_axis = len(x.shape) 
    t = np.arange(n_axis) 
    t[0] = axis 
    t[axis] = 0 
    xt = np.transpose(x.copy(), t) 
    np.random.shuffle(xt) 
    shuffled_x = np.transpose(xt, t) 
    return shuffled_x 

shuffle(array, axis=i)