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)

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

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

最後に、NaNを1ステップでマスクして変換することが効率的であることがよくあります:

MA.fix_invalid(A)

非常に簡単です。「ma」はまだネームスペースにない可能性があり、これらの関数は「NaN」と「「inf」を処理することに注意してください。

他のヒント

>>> 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