NumPy数组过滤和替换

4

我有一个数组

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

我想将小于1.5的任何内容替换为np.nan,即我想

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... 

其中需要填写的内容是某个东西。


@BradSolomon 我的意思是,我正在程序中间编写这个。有没有一个原地替换函数? - Lost1
2个回答

4

这个 [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不变,请优先使用掩码数组方法


2
我认为这实际上与原地操作无关(好吧,a[a<1.5] = np.nan 也是原地操作),而是为了避免赋值,以便可以在一行中完成。 - MSeifert

1

另一种使您按预期到达返回语句的选项:

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]

掩码 版权归属:@Jaime


1
应该提到:这会创建一个副本。 - wim
可以避免这个问题,我展示了如何解决。使用掩码数组方法也是不错的选择,但请注意,我认为这值得一提,因为在使用numpy时我们经常关注性能和内存使用细节。 - wim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接