2

numpy配列があるとします

a = np.array([0, 8, 25, 78, 68, 98, 1])

およびマスク配列b = [0, 1, 1, 0, 1]

次の配列を取得する簡単な方法はありますか:

[8, 25, 68]- 元の配列の最初、2 番目、4 番目の要素です。それは私にとってマスクのように聞こえます。

私が試した最も明白な方法は a[b] ですが、これは望ましい結果をもたらしません。この後、numpy でマスクされた操作を調べようとしましたが、間違った方向に導かれているようです。

4

2 に答える 2

3

abが両方とも numpy 配列であり、b厳密に 1 と 0 である場合:

>>> a[b.astype(np.bool)]
array([ 8, 25, 68])

これは、非常に小さなケースでのみ著しく高速であり、@falsetruの回答よりも範囲がはるかに制限されていることに注意してください。

a = np.random.randint(0,2,5)

%timeit a[a==1]
100000 loops, best of 3: 4.39 µs per loop

%timeit a[a.astype(np.bool)]
100000 loops, best of 3: 2.44 µs per loop

より大きなケースの場合:

a = np.random.randint(0,2,5E6)

%timeit a[a==1]
10 loops, best of 3: 59.6 ms per loop

%timeit a[a.astype(np.bool)]
10 loops, best of 3: 56 ms per loop
于 2013-09-12T13:43:52.527 に答える
1
>>> a = np.array([0, 8, 25, 78, 68, 98, 1])
>>> b = np.array([0, 1, 1, 0, 1])
>>> a[b == 1]
array([ 8, 25, 68])

代替使用itertools.compress

>>> import itertools
>>> list(itertools.compress(a, b))
[8, 25, 68]
于 2013-09-12T13:42:27.600 に答える