2016-09-06 3 views
0

私はかなり大きな数値行列を持っています。それはある種のポインタ問題でなければなりません。NumPy行列のインデックス範囲が正しくない[0,0,0,5:53] .shape = 43

とにかく、私は次の行列を持って

(Pdb) input_4d_volume.shape 
(26010, 48, 48, 48) 

すると、次のような私は、インデックス、全く問題ありません:

(Pdb) input_4d_volume[0,0,0,0:48].shape[0] 
48 

しかし、私は範囲をしようと、最大常に最大のアウト時48

たとえば、次の2つのケースを取る:

(Pdb) input_4d_volume[0,0,0,1:1+48].shape[0] 
47 
(Pdb) input_4d_volume[0,0,0,10:10+48].shape[0] 
38 

期待される出力は次のようになります

(Pdb) input_4d_volume[0,0,0,1:1+48].shape[0] 
48 
(Pdb) input_4d_volume[0,0,0,10:10+48].shape[0] 
38 

ので、(1+48)-1 = 48及び(10+48)-10 = 48(証拠として以下の実施例参照)

証拠として、これは動作し、私は完全に罰金

(Pdb) entire_volume.shape 
(99, 396, 396) 
(Pdb) entire_volume[0,0,0:100].shape[0] 
100 
(Pdb) entire_volume[0,0,10:10+100].shape[0] 
100 
を動作する別のマトリックスを有します

input_4d_volumeが大きすぎますか?

+0

'input_4d_volume [0,0,0,1:1 + 48] .shape [0]'と 'input_4d_volume [0,0,0,10:10 + 48] .shape [0]から何の出力を期待しますか? ] ' –

+0

私はそれを投稿に追加しました、それは常に48 –

答えて

3

Pythonでは、オブジェクトの長さよりも大きな数値にインデックスを付けることができます。たとえば、4-D入力アレイ形状(26010、48、48、48)の

import numpy as np 
a = np.arange(0, 10) 
a[5:100] 
# array([5, 6, 7, 8, 9]) 

ある場合、あなたは4次元にスライスされ、あなたはそれよりも大きい1次元アレイで終わることができません次元のサイズ。例えば、それは一例に動作することをご証明で

a = np.zeros((100,30,30,30)) 
a[0, 0, 0, 0:5].shape 
# (5L,) 

a[0, 0, 0, 0:32].shape 
# (30L,) 

は、あなたがentire_volume[0,0,10:10+100].shape[0]で109までの寸法指標10の3のスライスを取っています。これらは寸法の396サイズの範囲内にあるため、期待どおりの結果を得ることができます。

entire_volume[0,0,390:390+100].shape[0]の代わりに、返される配列の形状は、entire_volume[0,0,390:396].shape[0]でスライスした場合と同じです。 Pythonでは最大値を上回ることができますが、存在しないデータは返すことができません。

+0

私は簡単な間違いを笑っていたことを知っていた。ドー!ありがとう! –

+0

あなたはそれを理解してうれしい! –

0

あなたのnumpyの配列の形状は(26010, 48, 48, 48)あるので、あなたはnは、いくつかの正の整数であるinput_4d_volume[0,0,0,n:n+48].shape[0]を求めるとき、答えはmax(48-n,0)になります。あなたが見ている動作は正しいです。なぜなら、Pythonのインデックスは0から始まり、配列の終わりを超えてインデックスを受け入れるからです。 numpyのドキュメントは、スライシングの仕組みを説明しています:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

関連する問題