2017-12-14 24 views
1

縮小された3Dバージョンのnumpy.argsortの結果で4D numpy配列をソートするとします。このような何か:3D numpy配列の引数を4D numpy配列に渡す

array.shape 
    (7, 3178, 3178, 3) 
array_reduced.shape 
    (7, 3178, 3178) 
args=numpy.argsort(array_reduced,axis=0) 
array_sorted=array[args,:] 

これは、メモリエラーを返します。

--------------------------------------------------------------------------- 
    MemoryError        Traceback (most recent call last) 
    <ipython-input-48-04f432d9e05d> in <module>() 
      ----> 1 array_sorted=array[args,:] 

    MemoryError: 

これは、ラムダ関数をキャストする方法についての愚かな間違いかもしれないが、誰かが、私はそれを本当に感謝私を助けることができれば!

-------------------------------------- EDIT ------- ----------------

このコードは、私はそれが何をしたいんが、V遅いです:

array_sorted=np.zeros(array.shape,dtype=np.uint8) 
for thet in range (0, array.shape[0]): 
    print(thet) 
    for y in range (0, array.shape[1]): 
     for x in range (0, array.shape[2]): 
      array_sorted[thet,y,x,0]=(array[args[thet,y,x],y,x,0]) 
      array_sorted[thet,y,x,1]=(array[args[thet,y,x],y,x,1]) 
      array_sorted[thet,y,x,2]=(array[args[thet,y,x],y,x,2]) 
+0

'MemoryError'は、計算に必要なRAMがないことを意味します。あなたがfloats64の配列を使用していると仮定すると、各配列は約2Gbのデータなので、今日のコンピュータの典型的な量のRAMではすばやくすべてのデータを書き込むことができます。 – jadsq

+0

私は大規模なワークステーションを使用しています - 十分なRAMがあれば、コードは正常に動作するでしょうか?また、これらの配列はuint8 –

+2

です。あなたが期待していることをしていないようです。 'array [args、:]'は形状の配列を構築しています(7,3178,3178,3178,3178)、正確に何が起こっているのか分かりませんが、私は調査しようとします... – jadsq

答えて

0

あなたはnp.ogridを使用してループをベクトル化することができます:

i,j,k = np.ogrid[tuple(map(slice, array.shape[:-1]))] 
array_sorted = array[args, j, k]