2016-04-22 600 views
1

最近我在學習Python numpy時遇到了一個問題。其實我是一個遠程服務器上測試自定義的功能,而這個功能使用numpy.linalg.eig在Numpy數組中刪除NaN和Infs

import numpy 
from numpy import * 

def myfun(xAr,yAr) #xAr, yAr are Matrices 
    for i in xrange(xAr.shape[1]): 
    Mat=xAr.T*yAr*yAr.T*xAr 
    val,vec=linalg.eig(Mat) 
    # and so on... 

和測試提供了錯誤報告「線1088,在EIG:數組不能包含infs或NaN「。

因此,我試圖刪除包含的NaN或INF中那些列,我的代碼是:

def myfun(xAr,yAr) 
    id1=isfinite(sum(xAr,axis=1)) 
    id2=isfinite(sum(yAr,axis=1)) 
    xAr=xAr[id1&id2] 
    yAr=yAr[id1&id2] 
    for i in xrange(xArr.shape[1]): 
    Mat=xAr.T*yAr*yAr.T*xAr 
    val,vec=linalg.eig(Mat) 
    # and so on... 

但是同樣的錯誤再次出現。

我不知道此測試的確切數據值,因爲此測試位於遠程服務器上,原始數據值被禁止顯示。我所知道的是數據是一個包含NaN和Infs的矩陣。

任何人都可以給我一些建議,爲什麼是有限的無法在這裏工作,或者我刪除這些NaN和Infs做錯了?

+0

http://stackoverflow.com/questions/6701714/numpy-replace-a-number-with-nan –

+0

嗯,我想我得到了原因......也許是因爲週期零計算循環.... –

回答

2

給定兩個一陽指是這樣的:

In [1]: arr_1 
Out[1]: 
array([[ 0., nan, 2., 3.], 
     [ 4., 5., 6., 7.], 
     [ 8., 9., 10., 11.], 
     [ 12., nan, 14., 15.], 
     [ 16., 17., 18., 19.]]) 

In [2]: arr_2 
Out[2]: 
array([[ -0., -1., -2., nan], 
     [ -4., -5., -6., -7.], 
     [ -8., -9., -10., -11.], 
     [-12., -13., -14., -15.], 
     [-16., -17., -18., -19.]]) 

你可能想忽略列1和3,我們可以創建一個面具:

In [3]: mask_1 = np.isfinite(arr_1).all(axis=0) 

In [4]: mask_1 
Out[4]: array([ True, False, True, True], dtype=bool) 

In [5]: mask_2 = np.isfinite(arr_2).all(axis=0) 

In [6]: mask_2 
Out[6]: array([ True, True, True, False], dtype=bool) 

結合這些面具留給我們的權利列選擇:

In [7]: mask_1 & mask_2 
Out[7]: array([ True, False, True, False], dtype=bool) 

In [8]: arr_1[:, mask_1 & mask_2] 
Out[8]: 
array([[ 0., 2.], 
     [ 4., 6.], 
     [ 8., 10.], 
     [ 12., 14.], 
     [ 16., 18.]]) 

如果我們決定過濾掉無效的行,我們需要交換一個xes:

In [9]: mask_1 = np.isfinite(arr_1).all(axis=1) 

In [10]: mask_2 = np.isfinite(arr_2).all(axis=1) 

In [11]: arr_1[mask_1 & mask_2, :] 
Out[11]: 
array([[ 4., 5., 6., 7.], 
     [ 8., 9., 10., 11.], 
     [ 16., 17., 18., 19.]]) 

看來你已經和軸稍微混淆了,沒有更多。

1

np.nan_to_num()很適合重寫NaN和infs到ndarray中。

pd.DataFrame.dropna()(用在大熊貓數據幀數據)是偉大的 選擇性去除行或列而不是重寫他們 爲nan_to_num會做。

相關問題