1

因为我可以对数组执行操作,所以计算对角线上什么都不做,这样除了对角线之外的所有东西

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

4 回答 4

2

我想知道掩码数组是否可以做你想要的,例如,

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,然后屏蔽 0:

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

最后,一步屏蔽和转换 NaN 通常是有效的:

MA.fix_invalid(A)

非常简单,请记住“ma”可能还没有在您的命名空间中,而且这些函数处理“NaNs”“infs”,这通常是您想要的。

于 2009-12-02T07:40:15.997 回答
1
>>> 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

取决于你需要计算什么

于 2009-11-26T14:39:09.143 回答
1

照常进行计算,然后

myarray[arange(len(array)), arange(len(array))] = 0.
于 2009-11-30T05:13:32.853 回答
0

你能像往常一样进行计算,然后将对角线设置回零吗?

于 2009-11-26T14:18:11.230 回答