2016-03-24 4 views
4

numpy配列内の一部の行の順序をシャッフルしたいとします。これらの行は常に連続しています(たとえば、行23〜80をシャッフルします)。各行の要素の数は1から(配列が実際に1Dになるように)100まで変化できます。numpy配列の一部の行のシャッフル順序

以下は、shuffle_rows()がどのように動作するかを示すコード例です。このシャフリングを効率的に行うには、どうすればこのような方法を設計できますか?

import numpy as np 
>>> a = np.arange(20).reshape(4, 5) 
>>> a 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

>>> shuffle_rows(a, [1, 3]) # including rows 1, 2 and 3 in the shuffling 
array([[ 0, 1, 2, 3, 4], 
     [15, 16, 17, 18, 19], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14]]) 

答えて

3

np.random.shuffleを使用できます。これは、行内の要素ではなく、行自体をシャッフルします。 docsから

この機能は一例として、多次元アレイ

の最初のインデックスに沿って配列をシャッフル:

import numpy as np 


def shuffle_rows(arr,rows): 
    np.random.shuffle(arr[rows[0]:rows[1]+1]) 

a = np.arange(20).reshape(4, 5) 

print(a) 
# array([[ 0, 1, 2, 3, 4], 
#  [ 5, 6, 7, 8, 9], 
#  [10, 11, 12, 13, 14], 
#  [15, 16, 17, 18, 19]]) 

shuffle_rows(a,[1,3]) 

print(a) 
#array([[ 0, 1, 2, 3, 4], 
#  [10, 11, 12, 13, 14], 
#  [15, 16, 17, 18, 19], 
#  [ 5, 6, 7, 8, 9]]) 

shuffle_rows(a,[1,3]) 

print(a) 
#array([[ 0, 1, 2, 3, 4], 
#  [10, 11, 12, 13, 14], 
#  [ 5, 6, 7, 8, 9], 
#  [15, 16, 17, 18, 19]]) 
+0

私は 'を試みる場合print(shuffle_rows(a、[1,3])) 'Python 3で出力に" None "が表示されますか? – pir

+1

シャッフルが適所で行われます。 'print(a)'とシャッフルされた行が表示されます – tom

+0

ああ、意味があります。解明してくれてありがとう! – pir