ND numpy 배열을 필터링하고 특정 요소 만 유지
Nov 27 2020
나는 큰 ND numpy 배열을 다루고 있습니다. 해당 요소 만 다른 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
. 이것은 반복이나 다른 기능을 사용하지 않고 수행됩니다.
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]]])