サイズが 8x3 のデータ ポイントの配列があるとします。
data = np.arange(50,74).reshape(8,-1)
あなたが言うように、すべてのインデックスを2次元ペアとして本当にサンプリングしたい場合、私が考えることができる最もコンパクトな方法は次のとおりです。
#generate a permutation of data's size, coerced to data's shape
idxs = divmod(np.random.permutation(data.size),data.shape[1])
#iterate over it
for x,y in zip(*idxs):
#do something to data[x,y] here
pass
ただし、一般的には、単に 2 次元配列をシャッフルするために 2 次元配列としてアクセスする必要はなく、その場合はさらにコンパクトにすることができます。配列に対して 1 次元ビューを作成するだけで、インデックスのラングリングを節約できます。
flat_data = data.ravel()
flat_idxs = np.random.permutation(flat_data.size)
for i in flat_idxs:
#do something to flat_data[i] here
pass
これにより、必要に応じて2次元の「元の」配列が並べ替えられます。これを確認するには、次を試してください。
flat_data[12] = 1000000
print data[4,0]
#returns 1000000