Выполнение операций над массивом NumPy, но маскирование значений по диагонали из этих операций

StackOverflow https://stackoverflow.com/questions/1803860

  •  05-07-2019
  •  | 
  •  

Вопрос

как я могу выполнять операции над массивами, так что ничего не делает по диагонали рассчитывается так, что все, кроме диагонали

array ([[0.,  1.37, 1.,   1.37, 1.,   1.37, 1.]
       [1.37, 0. ,  1.37, 1.73, 2.37, 1.73, 1.37]
       [1. ,  1.37, 0. ,  1.37, 2. ,  2.37, 2. ]
       [1.37, 1.73, 1.37, 0. ,  1.37, 1.73, 2.37]
       [1. ,  2.37, 2. ,  1.37, 0. ,  1.37, 2. ]
       [1.37, 1.73, 2.37, 1.73, 1.37, 0. ,  1.37]
       [1. ,  1.37, 2. ,  2.37, 2. ,  1.37, 0. ]])

чтобы избежать значения NaN, но сохранил нулевое значение по диагонали во всех ответах

Это было полезно?

Решение

Интересно, могут ли маскированные массивы делать то, что вы хотите, например,

import numpy as NP
A = NP.random.random_integers(0, 9, 16).reshape(4, 4)
dg = NP.r_[ [NP.nan] * 4 ]  # proper syntax is 'nan' not 'NaN'
dg = NP.diag(dg)
A += dg                     # a 4x4 array w/ NaNs down the main diagonal
NP.sum(A, axis=1)           # doesn't work, gives: array([ NaN,  NaN,  NaN,  NaN])  
from numpy import ma as MA
Am = **MA.masked_invalid**(A)
NP.sum(Am, axis=1)         # now it works (treats 'nan' as 0)

Другой способ сделать это, конечно, сначала преобразовать NaN в 0, затем замаскировать 0s:

NP.nan_to_num(A)
MA.masked_equal(A, 0)

Наконец, часто эффективно маскировать и преобразовывать NaN за один шаг:

MA.fix_invalid(A)

Довольно просто, просто имейте в виду, что 'ma' может еще не быть в вашем пространстве имен, а также что эти функции работают с 'NaNs' и 'infs', что обычно является тем, что вам нужно.

Другие советы

>>> arr = [
... [0.,  1.37, 1.,   1.37, 1.,   1.37, 1.],
... [1.37, 0. ,  1.37, 1.73, 2.37, 1.73, 1.37],
... [1. ,  1.37, 0. ,  1.37, 2. ,  2.37, 2. ],
... [1.37, 1.73, 1.37, 0. ,  1.37, 1.73, 2.37],
... [1. ,  2.37, 2. ,  1.37, 0. ,  1.37, 2. ],
... [1.37, 1.73, 2.37, 1.73, 1.37, 0. ,  1.37],
... [1. ,  1.37, 2. ,  2.37, 2. ,  1.37, 0. ]
... ]
>>> for i in range(6):
...     for y in range(6):
...             if (i <> y):
...                     print arr[i][y]*arr[y][i]
...
1.8769
1.0
1.8769
1.0
1.8769
1.8769
1.8769
2.9929
5.6169
2.9929
1.0
1.8769
1.8769
4.0
5.6169
1.8769
2.9929
1.8769
1.8769
2.9929
1.0
5.6169
4.0
1.8769
1.8769
1.8769
2.9929
5.6169
2.9929
1.8769

Зависит от того, что вам нужно рассчитать

Выполните ваши расчеты как обычно, а затем

myarray[arange(len(array)), arange(len(array))] = 0.

Можете ли вы просто выполнить вычисления как обычно, а затем установить диагональ обратно на ноль?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top