2016-10-14 11 views
2

私は3次元配列があります。ディメンションは128 x 64 x 8192まで上がることができます。私がしたいのは、ペアごとに交換することで最初のディメンションの順序を変更することです。効率的にnumpy配列の順番を変更します

私がこれまで持っていた唯一のアイデアは、正しい順序でインデックスのリストを作成することです。

order = [1,0,3,2...127,126] 
data_new = data[order] 

次の2つの軸に第一の軸を分割するために作り変えることができ

+0

だから、 'data [order]'はあなたのために働くそれは効率が悪いと思う? – Divakar

+0

@Divakar正確 – Glostas

答えて

4

を、私は、これは非常に効率的ではないことを、恐れるが、私はこれまでのところは良いアイデアを持っていない、これらの軸のように、後者は長さ2でありますその軸に沿って[::-1]で配列を反転し、最後に元の形状に戻します。

したがって、我々はそうのような実装を持っているでしょう - あなたが効率的にそれら常にひっくり返すインデックスorderを作成するために探している場合、私たちは何かを行うことができ、また

In [170]: a = np.random.randint(0,9,(6,3)) 

In [171]: order = [1,0,3,2,5,4] 

In [172]: a[order] 
Out[172]: 
array([[0, 8, 5], 
     [4, 5, 6], 
     [0, 0, 2], 
     [7, 3, 8], 
     [1, 6, 3], 
     [2, 4, 4]]) 

In [173]: a.reshape(-1,2,*a.shape[1:])[:,::-1].reshape(a.shape) 
Out[173]: 
array([[0, 8, 5], 
     [4, 5, 6], 
     [0, 0, 2], 
     [7, 3, 8], 
     [1, 6, 3], 
     [2, 4, 4]]) 

-

a.reshape(-1,2,*a.shape[1:])[:,::-1].reshape(a.shape) 

のサンプル実行このように -

order = np.arange(data.shape[0]).reshape(-1,2)[:,::-1].ravel() 
関連する問題