2017-01-30 26 views
2

配列が(50,5)であるとします。データポイントの行/シーケンスのグループ化、つまりすべての行をシャッフルする代わりに、5行のシャンクをシャッフルする代わりに、シャッフルする方法はありますか?2D配列の行のシャッフルグループ - NumPy

おかげ

答えて

2

アプローチ#1:ここで、グループサイズに基づいて3D配列に整形アプローチだnp.random.permutationから得られたシャッフルインデックスを有するブロックのインデックスにインデックスし、最終的にバック2Dに整形 -

サンプル実行
N = 5 # Blocks of N rows 
M,n = a.shape[0]//N, a.shape[1] 
out = a.reshape(M,-1,n)[np.random.permutation(M)].reshape(-1,n) 

-

In [141]: a 
Out[141]: 
array([[89, 26, 12], 
     [97, 60, 96], 
     [94, 38, 54], 
     [41, 63, 29], 
     [88, 62, 48], 
     [95, 66, 32], 
     [28, 58, 80], 
     [26, 35, 89], 
     [72, 91, 38], 
     [26, 70, 93]]) 

In [142]: N = 2 # Blocks of N rows 

In [143]: M,n = a.shape[0]//N, a.shape[1] 

In [144]: a.reshape(M,-1,n)[np.random.permutation(M)].reshape(-1,n) 
Out[144]: 
array([[94, 38, 54], 
     [41, 63, 29], 
     [28, 58, 80], 
     [26, 35, 89], 
     [89, 26, 12], 
     [97, 60, 96], 
     [72, 91, 38], 
     [26, 70, 93], 
     [88, 62, 48], 
     [95, 66, 32]]) 

アプローチ#2:一つは、単にその場の変化のためにnp.random.shuffleを使用することができます -

np.random.shuffle(a.reshape(M,-1,n)) 

サンプル実行 -

In [156]: a 
Out[156]: 
array([[15, 12, 14], 
     [55, 39, 35], 
     [73, 78, 36], 
     [54, 52, 32], 
     [83, 34, 91], 
     [42, 11, 98], 
     [27, 65, 47], 
     [78, 75, 82], 
     [33, 52, 93], 
     [87, 51, 80]]) 

In [157]: N = 2 # Blocks of N rows 

In [158]: M,n = a.shape[0]//N, a.shape[1] 

In [159]: np.random.shuffle(a.reshape(M,-1,n)) 

In [160]: a 
Out[160]: 
array([[15, 12, 14], 
     [55, 39, 35], 
     [27, 65, 47], 
     [78, 75, 82], 
     [73, 78, 36], 
     [54, 52, 32], 
     [33, 52, 93], 
     [87, 51, 80], 
     [83, 34, 91], 
     [42, 11, 98]]) 
関連する問題