最近,我在学习Python时遇到了一个问题。实际上,我在远程服务器上测试一个自定义函数,这个函数使用numpy.linalg.eig:
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或NaNs”。
因此,我尝试删除那些包含NaNs或Infs的列,我的代码是:
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...然而,同样的错误再次出现。
我不知道这个测试的确切数据值,因为这个测试在远程服务器上,原始数据值被禁止显示。我知道的是数据是一个包含NaNs和Infs的矩阵。
有人能给我一些建议吗?为什么isfinite不能在这里工作,或者我在删除这些NaNs和Infs时做错了什么?
发布于 2016-04-22 11:26:43
有两个像这样的地方:
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.]])如果我们决定将无效行过滤掉,则需要交换轴:
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.]])看来你把斧头弄得有点乱了,没别的了。
发布于 2016-04-23 18:03:29
np.nan_to_num()很适合在ndarray中重写NaNs和infs。
pd.DataFrame.dropna() (使用熊猫数据中的数据)可以有选择地删除行或列,而不是像nan_to_num那样重写行或列。
https://stackoverflow.com/questions/36791490
复制相似问题