ND numpy配列をフィルタリングし、特定の要素のみを保持します
Nov 27 2020
私は大きなNDnumpy配列を扱っています。これらの要素のみを別のnumpy配列に存在させ、残りの値を0に設定したいと思います。
たとえば、このnumpy配列を検討すると
array([[[36, 1, 72],
[76, 50, 23],
[28, 68, 17],
[84, 75, 69]],
[[ 5, 15, 93],
[92, 92, 88],
[11, 54, 21],
[87, 76, 81]]])
そして、私が設定する0
値である場合を除いて、すべての場所で50
、11
、72
回答
1 DanielLenz Nov 27 2020 at 09:31
残っているはずの値と組み合わせreduce
てnp.logical_or
繰り返し、マスクを設定しました。
import functools
import numpy as np
arr = np.array([[[36, 1, 72],
[76, 50, 23],
[28, 68, 17],
[84, 75, 69]],
[[ 5, 15, 93],
[92, 92, 88],
[11, 54, 21],
[87, 76, 81]]])
# Set the values that should not
# be set to zero
vals = [11, 50, 72]
# Create a mask by looping over the above values
mask = functools.reduce(np.logical_or, (arr==val for val in vals))
masked = np.where(mask, arr, 0.)
print(masked)
> array([[[ 0., 0., 72.],
[ 0., 50., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[11., 0., 0.],
[ 0., 0., 0.]]])
2 swag2198 Nov 27 2020 at 09:33
のみを使用する場合はnumpy
、vals
配列をa
。より1ランク上にキャストすることで、ブロードキャストを簡単に使用してこれを行うこともできます。これは、反復やその他の機能を使用せずに実現されます。
import numpy as np
a = np.array([[[36, 1, 72],
[76, 50, 23],
[28, 68, 17],
[84, 75, 69]],
[[ 5, 15, 93],
[92, 92, 88],
[11, 54, 21],
[87, 76, 81]]])
vals = np.array([50, 11, 72])
inds = a == vals[:, None, None, None]
a[~np.any(inds, axis = 0)] = 0
a
出力:
array([[[ 0, 0, 72],
[ 0, 50, 0],
[ 0, 0, 0],
[ 0, 0, 0]],
[[ 0, 0, 0],
[ 0, 0, 0],
[11, 0, 0],
[ 0, 0, 0]]])