5

Numpy配列は、たとえばインデックスのリストを許可します

a = np.arange(1000)
l = list([1,44,66,33,90,345])
a[l] = 22

ただし、たとえば、複数のスライスのインデックス作成またはインデックスとスライスを使用する場合、この方法は機能しません。

a = np.arange(1000)
l = list([1,44,66,33,90, slice(200,300) , slice(500,600) ])
a[l] = 22

このコードはエラーメッセージを返します:

IndexError: too many indices

私の質問は非常に単純です。numpyまたはscipyに、この種のインデックスを使用するための効率的な方法が存在するかどうかを知っていますか?

または、このようなインデックス作成方法を使用するための優れた効率的な方法は何ですか?

スライスを使用すると非常に高速なコードが生成されることを忘れないでください。私の問題は、できるだけ高速なコードを使用することです。

4

2 に答える 2

4

私の頭に浮かぶのは:

a = np.arange(1000)
l = np.hstack(([1, 44, 66, 33, 90], np.arange(200, 300), np.arange(500, 600)))
a[l] = 22

それが最も簡単な方法かどうかはわかりませんが、機能します。

編集:これはスライスを使用するよりも遅いというのは正しいです。ただし、任意の値でスライスオブジェクトを作成することはできません。たぶん、あなたはただいくつかの割り当てをするべきです:

%timeit a[np.hstack(([1, 44, 66, 33, 90], np.arange(200, 300), np.arange(500, 600)))] = 22
10000 loops, best of 3: 39.5 us per loop

%timeit a[[1, 44, 66, 33, 90]] = 22; a[200:300] = 22; a[500:600] = 22
100000 loops, best of 3: 18.4 us per loop
于 2012-11-23T08:27:36.307 に答える
0

ファンシーインデックスを使用して、インデックスリストを作成できます。

l = numpy.array([1,44,66,33,90]+range(200,300)+range(500,600))
a[l] = 22

しかし、@ Levが指摘したように、これはこれ以上速くはないかもしれません(ただし、インデックスリストを事前に計算できればほぼ確実になります)。

ただし、ファンシーインデックスは軸ごとに適用されます。したがって、1つの軸でインデックスを作成し、他の軸をスライスすることができます。

a = numpy.random.randn(4, 5, 6)
l = numpy.array([1, 2])
a[l, slice(None), slice(2, 4)] = 10
于 2012-11-23T09:49:10.180 に答える