numpy数组过滤并替换

时间:2017-09-06 20:38:52

标签: python numpy nan

我有一个数组

a = np.array([1,2,3,4,np.nan])

我想用np.nan替换小于1.5的任何内容,即我希望

a = np.array([np.nan,2,3,4,np.nan])

我该怎么做?

我做了

 a[a<1.5] = np.nan

我在IPython(Py3.4)RuntimeWarning: invalid value encountered in less中遇到以下运行时警告错误。这是因为我的名单有np.nan吗?有什么办法可以防止这种情况发生吗?

还有一种方法可以在没有分配的情况下进行此内联吗?而不是做

a[a<1.5]=np.nan 
return a 

我可以做到

 return a... 

这里......需要填写。

2 个答案:

答案 0 :(得分:3)

  

这是[RuntimeWarning],因为我的列表有np.nan吗?

  

我能做些什么来阻止这种情况吗?

在您的情况下,可以安全地忽略此警告。因此,您不会意外地抑制不相关的警告,请除了显示的一行之外,不要在上下文管理器中放置任何其他内容。

>>> import numpy as np
>>> a = np.array([1,2,3,4,np.nan])
>>> with np.errstate(invalid='ignore'):
...     a[a<1.5] = np.nan
...     
>>> a
array([ nan,   2.,   3.,   4.,  nan])

此操作就地,此处不会创建副本。要返回原始a未修改的副本,请更喜欢masked array approach

答案 1 :(得分:1)

另一个可以根据需要转到return语句的选项:

mask = ~np.isnan(a)
mask[mask] &= a[mask] < 1.5
return np.where(mask, np.nan, a)

示例:

def ma_lessthan(arr, num):
    mask = ~np.isnan(arr)
    mask[mask] &= arr[mask] < num
    return np.where(mask, np.nan, arr)

print(ma_lessthan(a, 1.5))
[ nan   2.   3.   4.  nan]

mask信用到:@Jaime