Удалить элементы в ndarray на основе условия в одном измерении - PullRequest
1 голос
/ 28 марта 2020

В Numpy ndarray, как мне удалить элементы в измерении на основе условия в другом измерении?

У меня есть:

[[[1 3]
  [1 4]]

 [[2 6]
  [2 8]]

 [[3 5]
  [3 5]]]

Я хочу удалить на основе условие x[:,:,1] < 7

Требуемый выход ([:,1,:] удалено):

[[[1 3]
  [1 4]]

 [[3 5]
  [3 5]]]

РЕДАКТИРОВАТЬ: исправлена ​​опечатка

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Это может работать:

x[np.where(np.all(x[..., 1] < 7, axis=1)), ...]

доходность

array([[[[1, 3],
         [1, 4]],

        [[3, 5],
         [3, 5]]]])

Вы получаете дополнительное измерение, но его легко удалить:

np.squeeze(x[np.where(np.all(x[..., 1] < 7, axis=1)), ...])

Кратко как это работает:

Сначала условие: x[..., 1] < 7.
Затем проверьте, действительно ли условие для всех элементов вдоль указанной c оси: np.all(x[..., 1] < 7, axis=1).
Затем используйте where чтобы получить индексы вместо массива логических значений: np.where(np.all(x[..., 1] < 7, axis=1)).
И вставить эти индексы в соответствующее измерение: x[np.where(np.all(x[..., 1] < 7, axis=1)), ...].

1 голос
/ 28 марта 2020

В качестве желаемого выхода вы фильтруете x по оси = 0. Поэтому вы можете попробовать этот способ

m = (x[:,:,1] < 7).all(1)
x_out = x[m,:,:]

или просто

x_out = x[m]   

Out[70]:
array([[[1, 3],
        [1, 4]],

       [[3, 5],
        [3, 5]]])
...