2009-11-26 57 views
1

屏蔽沿對角線值,我可以這麼說確實在對角線上 沒有對數組執行操作是這樣計算的,所有的,但對角線在NumPy的執行操作arrray但這些操作

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值,但在所有響應中保留對角線上的零值

+0

你想做什麼?涉及的操作是什麼?你正在嘗試做矩陣乘法還是反演?你的問題很不清楚。 – jprete 2009-11-26 14:19:05

+0

是的,我需要做的是 – ricardo 2009-11-26 14:21:48

回答

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) 

另一種方法是,首先將NaNs轉換爲0,然後 屏蔽0:

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

最後,它通常能有效地掩蓋和轉換NaN的一個步驟:

MA.fix_invalid(A) 

非常簡單,只需記住,「馬」可能還沒有在你的命名空間,並且這些函數還處理'NaNs''infs',這通常是你想要的。

0

您能否按正常方式進行計算,然後將對角線設置回零?

+0

是的,我需要做的是 – ricardo 2009-11-26 14:22:36

+0

然後在每次計算後做這件事:對於我在範圍內(len(array)):array [i] [i] = 0 – 2009-11-26 15:57:22

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 

取決於你需要計算

1

做你計算正常什麼,然後

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