2016-04-28 8 views
1

IndexErrorを投げずにnd配列からエントリをルックアップすることはできますか?numpy配列外でのインデックス作成時のデフォルト値(些細でないインデックスであっても)

私のような何かを望んでいる:

>>> a = np.arange(10) * 2 
>>> a[[-4, 2, 8, 12]] 
IndexError 
>>> wrap(a, default=-1)[[-4, 2, 8, 12]] 
[-1, 4, 16, -1] 

>>> wrap(a, default=-1)[200] 
-1 

または可能性がよりget_with_default(a, [-4, 2, 8, 12], default=-1)よう

これを行うには、いくつかの組み込みの方法はありますか?例外をスローしてゴミを返さないようにnumpyに頼むことができますか?これをデフォルト値に置き換えますか?ここに12のリターン18、最後の値にインデックスを作成 - あなたは戻り値を超える多くのコントロールを持っていない場合を除き

答えて

2

np.takeclipモードで、ソートのこの

In [155]: a 
Out[155]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) 

In [156]: a.take([-4,2,8,12],mode='raise') 
... 
IndexError: index 12 is out of bounds for size 10 

In [157]: a.take([-4,2,8,12],mode='wrap') 
Out[157]: array([12, 4, 16, 4]) 

In [158]: a.take([-4,2,8,12],mode='clip') 
Out[158]: array([ 0, 4, 16, 18]) 

を行います。そして治療-4、他の方向に範囲外として、デフォルトを追加する0

一つの方法を返すことは、正確にはかなりが、起動しないパッドにa最初

In [174]: a = np.arange(10) * 2 
In [175]: ind=np.array([-4,2,8,12]) 

In [176]: np.pad(a, [1,1], 'constant', constant_values=-1).take(ind+1, mode='clip') 
Out[176]: array([-1, 4, 16, -1]) 

です。

+0

十分に感謝!境界をデフォルト値で埋めることは、その作業を行うのに十分です。 – Eric

+0

うん、 'np.take'は' [] 'と同じインデックス付け規則では動作しません。 'np.s [1、[2、3、4]、:]'のようなものを、渡すのに適したオブジェクトに変換する簡単な方法はありますか? – Eric

+0

実際、np.takeは単純なケースでしか動作しないようです。おそらく私は2D配列を代わりに使っていたはずです – Eric

関連する問題