Выполнение операций над массивом NumPy, но маскирование значений по диагонали из этих операций - PullRequest
1 голос
/ 26 ноября 2009

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

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, но сохранило нулевое значение по диагонали во всех ответах

Ответы [ 4 ]

2 голосов
/ 02 декабря 2009

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

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', что обычно является тем, что вы хотите. 1012 *

1 голос
/ 26 ноября 2009
>>> 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

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

1 голос
/ 30 ноября 2009

Сделайте свой расчет как обычно, а затем

myarray[arange(len(array)), arange(len(array))] = 0.
0 голосов
/ 26 ноября 2009

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

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