在NumPy阵列上执行操作,但从这些操作沿对角线屏蔽值

时间:2009-11-26 14:07:49

标签: python arrays numpy scipy

因为我可以对数组执行操作,因此在对角线上不执行任何操作 计算得除了对角线以外的所有

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 个答案:

答案 0 :(得分: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',这通常是你想要的。

答案 1 :(得分: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

取决于您需要计算的内容

答案 2 :(得分:1)

正常进行计算,然后

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

答案 3 :(得分:0)

您可以正常进行计算,然后将对角线设置为零吗?