Нахождение максимальной ненулевой матрицы в питоне - PullRequest
0 голосов
/ 29 ноября 2018

Предположим, у нас есть матрица:

a = array([[ 2.,  3.,  0.,  0.,  0.],
           [ 0.,  4.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.]])

, что является наилучшим способом найти максимальную ненулевую матрицу (т.е. матрицу, которая не является полностью нулевой) и охватывает все элементы, например

[[2.,3.],
 [0.,4.]]

Я прошел numpy.nonzero, который дает индексы ненулевых элементов, но как я могу эффективно использовать его для получения ожидаемой матрицы?

матрица должна быть квадратной.Сейчас я придумаю это,

a[:np.nonzero(a)[0][-1]+1,:np.nonzero(a)[1][-1]+1]

Это работает.Но не кажется элегантным.Также он не будет работать, если матрица не начинается с 0. Например,

[[0,0,2,3,0],
 [0,0,0,4,0],
 [0,0,0,0,0],
 [0,0,0,0,0],
 [0,0,0,0,0]]

здесь ожидаемый результат равен

[[2,3],
 [0,4]]

1 Ответ

0 голосов
/ 29 ноября 2018

Причина, по которой он не работает во втором случае, заключается в том, что ваша начальная точка для формирования матрицы всегда 0,0, так как вы всегда указываете конечный диапазон.

Получается минимальный индекс np.nonzero в качестве начального диапазона, а максимальный индекс np.nonzero в качестве конечного диапазона для обеих осей.Поэтому гарантированно включаются все ненулевые элементы

a[np.min(np.nonzero(a)[0]):np.max(np.nonzero(a)[0])+1,
  np.min(np.nonzero(a)[1]):np.max(np.nonzero(a)[1])+1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...