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]]])