Numpy извлекает значения по диагонали из матрицы

Мой вопрос похож (расширенная версия) на этот пост: Numpy извлечь строку, столбец и значение из матрицы. В этом посте я извлекаю элементы, которые больше нуля, из входной матрицы, теперь я хочу также извлечь элементы по диагонали. Итак, в этом случае

from numpy import *
import numpy as np

m=np.array([[0,2,4],[4,0,0],[5,4,0]])
dist=[]
index_row=[]
index_col=[]
indices=np.where(matrix>0)
index_col, index_row = indices
dist=matrix[indices]
return index_row, index_col, dist

мы могли бы получить,

index_row = [1 2 0 0 1]
index_col = [0 0 1 2 2]
dist = [2 4 4 5 4]

и теперь это то, что я хочу,

index_row = [0 1 2 0 1 0 1 2]
index_col = [0 0 0 1 1 2 2 2]
dist = [0 2 4 4 0 5 4 0]

Я попытался изменить строку 8 в исходном коде на это,

indices=np.where(matrix>0 & matrix.diagonal)

но получил эту ошибку,

введите здесь описание изображения

Как получить желаемый результат? Пожалуйста, дайте мне несколько предложений, спасибо!


person Heinz    schedule 19.06.2014    source источник
comment
Вам нужны скобки: (matrix>0) & matrix.diagonal из-за приоритета оператора.   -  person HYRY    schedule 19.06.2014
comment
@HYRY Я попробовал и получил еще одну ошибку: TypeError: неподдерживаемые типы операндов для &: 'tuple' и 'builtin_function_or_method'   -  person Heinz    schedule 19.06.2014


Ответы (1)


Вы можете использовать следующий метод:

  1. получить массив масок
  2. заполнить диагональ маски до True
  3. выберите элементы, где элементы в маске имеют значение True

Вот код:

m=np.array([[0,2,4],[4,0,0],[5,4,0]])
mask = m > 0
np.fill_diagonal(mask, True)

m[mask]
person HYRY    schedule 19.06.2014