2016-04-22 601 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会做。

相关问题