1

インデックスがエッジをラップする配列から(正方形の)セクションを返そうとしています。いくつかのインデックス作成を調整する必要がありますが、うまくいきますが、最後の 2 行のコードは同じ結果になると思いますが、そうでないのはなぜですか? numpy は最後の行をどのように解釈しますか?

おまけの質問として、このアプローチはひどく非効率的ですか? productラップアラウンドするように範囲をモジュロする必要があるため、を使用しています。それ以外の場合a[imin:imax, jmin:jmax, :]はもちろん、を使用します。

import numpy as np
from itertools import product

i = np.arange(-1, 2) % 3
j = np.arange(1, 4) % 3

a = np.random.randint(1,10,(3,3,2))

print a[i,j,:]
# Gives 3 entries [(i[0],j[0]), (i[1],j[1]), (i[2],j[2])]
# This is not what I want...

indices = list(product(i, j))
print indices

indices = zip(*indices)

print 'a[indices]\n', a[indices]
# This works, but when I'm explicit:
print 'a[indices, :]\n', a[indices, :]
# Huh?
4

3 に答える 3

4

問題は、次の場合に高度なインデックス作成がトリガーされることです。

選択オブジェクトobjは [...] 少なくとも 1 つのシーケンス オブジェクトまたは ndarray を持つタプルです

あなたの場合の最も簡単な修正は、繰り返しインデックスを使用することです。

a[i][:, j]

別の方法として、 を使用することもできます。ndarray.take次のように指定すると、モジュロ演算が実行されますmode='wrap'

a.take(np.arange(-1, 2), axis=0, mode='wrap').take(np.arange(1, 4), axis=1, mode='wrap')
于 2012-09-21T12:41:25.963 に答える
3

私の意見では、productソリューションよりも優れた高度なインデックス作成の別の方法を提供します。

すべての次元に整数配列がある場合、これらは一緒にブロードキャストされ、出力はブロードキャスト形状と同じ出力になります (意味がわかります)...

i, j = np.ix_(i,j) # this adds extra empty axes

print i,j 

print a[i,j]
# and now you will actually *not* be surprised:
print a[i,j,:]

これは 3x3x2 配列ですが、9x2 配列がありましたが、単純な形状変更で修正され、実際には 3x3x2 配列がおそらく必要なものに近いことに注意してください。

実際には、驚きはある意味でまだ隠されています。なぜなら、あなたの例a[indices]では は同じですが、a[indices[0], indicies[1]]それが異なることは大きな驚きではないからです。同じ結果が得られることに注意してください。a[indicies,:]a[(indicies[0], indicies[1]),:]a[indicies[0], indicies[1],:]

于 2012-09-21T12:46:30.520 に答える
1

参照: http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#advanced-indexing

を追加する:と、整数のインデックス作成とスライスが混在しています。ルールは非常に複雑で、上記のリンクよりも詳しく説明されています。

于 2012-09-21T12:24:23.380 に答える