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)

これを行うもう 1 つの方法は、もちろん、最初に NaN を 0 に変換してから 0 をマスクすることです。

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

最後に、多くの場合、NaN のマスクと変換を 1 ステップで行うと効率的です。

MA.fix_invalid(A)

非常に簡単ですが、「ma」がまだ名前空間にない可能性があること、およびこれらの関数が「NaN」「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 に答える