Numpy Удалить строки и столбцы из 3D-массива - PullRequest
0 голосов
/ 06 января 2019

Допустим, у вас есть массив 5x5x5

    a = np.ones((5,5,5))
    a[:,3,:] = 0
    a[:,:,3] = 0

(я знаю, это ужасно)

Возвращает

    [[[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]

 [[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]

 [[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]

 [[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]

 [[1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [1. 1. 1. 0. 1.]
  [0. 0. 0. 0. 0.]
  [1. 1. 1. 0. 1.]]]

Что я хочу сделать, так это удалить все строки и столбцы по всей оси, равной 0, и вернуть новый массив 4x4x4, содержащий только 1 с.

Я могу сделать это для двумерного массива с

a = np.delete(a,np.where(~a.any(axis=0))[0], axis=1)
a = a[~np.all(a == 0, axis=1)]

Но не могу понять, как это сделать с 3 измерениями

У кого-нибудь есть идеи, как это можно сделать?

1 Ответ

0 голосов
/ 06 января 2019

Вы можете найти индексы строк со всеми нулевыми элементами отдельно для второй и третьей осей, а затем удалить их, используя np.delete:

In [25]: mask = (a == 0)

In [26]: sec = np.where(mask.all(1))[1]

In [27]: third = np.where(mask.all(2))[1]

In [28]: new = np.delete(np.delete(a, sec[1], 1), third, 2)

Обратите внимание, что вместо создания нового массива вы можете переназначить результат на a, если вы намеревались это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...