首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除Numpy数组中的NaNs和Infs

删除Numpy数组中的NaNs和Infs
EN

Stack Overflow用户
提问于 2016-04-22 10:37:11
回答 2查看 1.8K关注 0票数 2

最近,我在学习Python时遇到了一个问题。实际上,我在远程服务器上测试一个自定义函数,这个函数使用numpy.linalg.eig:

代码语言:javascript
复制
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的列,我的代码是:

代码语言:javascript
复制
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时做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-22 11:26:43

有两个像这样的地方:

代码语言:javascript
复制
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。我们可以为此创建一个掩码:

代码语言:javascript
复制
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)

将这些掩码与正确的列选择组合在一起:

代码语言:javascript
复制
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.]])

如果我们决定将无效行过滤掉,则需要交换轴:

代码语言:javascript
复制
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.]])

看来你把斧头弄得有点乱了,没别的了。

票数 2
EN

Stack Overflow用户

发布于 2016-04-23 18:03:29

np.nan_to_num()很适合在ndarray中重写NaNs和infs。

pd.DataFrame.dropna() (使用熊猫数据中的数据)可以有选择地删除行或列,而不是像nan_to_num那样重写行或列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36791490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档