Numpy Arrray에서 작업을 수행하지만 이러한 작업에서 대각선을 따라 값을 마스킹합니다.

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)

물론이 작업을 수행하는 다른 방법은 먼저 NANS를 0S로 변환 한 다음 0S를 마스킹하는 것입니다.

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

마지막으로, 한 단계에서 NAN을 마스크하고 변환하는 것이 종종 효율적입니다.

MA.fix_invalid(A)

매우 간단합니다. 'Ma'는 아직 네임 스페이스에 있지 않을 수도 있고 이러한 기능은 'Nans'를 다루고 있음을 명심하십시오. 그리고 'infs', 이것은 보통 당신이 원하는 것입니다.

다른 팁

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

계산을 정상적으로 수행 한 다음 나중에 대각선을 다시 0으로 설정할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top