2014-09-07 5 views
2

У меня очень разреженные матрицы, поэтому я хочу извлечь наименьшую прямоугольную область матрицы с ненулевыми значениями. Я знаю, что numpy.nonzero (a) дает вам индексы элементов, отличных от нуля, но как я могу использовать это для извлечения подматрицы, содержащей элементы матрицы по этим индексам.Numpy: заданы ненулевые индексы матрицы, как извлекать элементы в подматрицу

Чтобы дать пример, это то, что я стремлюсь:

>>> test 
array([[0, 0, 0, 0, 0, 0], 
     [0, 1, 1, 1, 1, 0], 
     [0, 0, 1, 1, 0, 0]]) 
>>> np.nonzero(test) 
(array([1, 1, 1, 1, 2, 2]), array([1, 2, 3, 4, 2, 3])) 
>>> submatrix(test) 
array([[1, 1, 1, 1], 
     [0, 1, 1, 0]]) 

Кто-нибудь знает простой способ сделать это в NumPy? Благодарю.

+1

Ваш пример вывода и ваше описание не точно такой же - вы хотите, чтобы извлечь все ненулевые элементы матрицы, или вы хотите, чтобы получить матрицу, представляющую наименьшее прямоугольной области исходной матрицы, содержащей все ненулевые элементы? – Brionius

+0

Извините. Да, я хочу самый маленький прямоугольный регион, я должен был это сделать ясно; Я отредактирую. – user2909415

ответ

4

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

import numpy as np 

def submatrix(arr): 
    x, y = np.nonzero(arr) 
    # Using the smallest and largest x and y indices of nonzero elements, 
    # we can find the desired rectangular bounds. 
    # And don't forget to add 1 to the top bound to avoid the fencepost problem. 
    return arr[x.min():x.max()+1, y.min():y.max()+1] 

test = np.array([[0, 0, 0, 0, 0, 0], 
       [0, 1, 1, 1, 1, 0], 
       [0, 0, 1, 1, 0, 0]]) 

print submatrix(test) 

# Result: 
# [[1 1 1 1] 
# [0 1 1 0]] 
+0

Спасибо. Очень приятное решение, по общему признанию, у меня было гораздо более сложное решение, поэтому я хотел задать вопрос первым. – user2909415

Смежные вопросы