【问题标题】:numpy array filter and replacenumpy 数组过滤和替换
【发布时间】:2018-02-15 11:04:35
【问题描述】:

我有一个数组

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

那个......是需要填写的东西。

【问题讨论】:

  • @BradSolomon 我的意思是,我在一个程序中间写这个。有就地替换功能吗?

标签: python numpy nan


【解决方案1】:

这是 [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

【讨论】:

  • 我不认为这实际上是关于就地操作(好吧,a[a&lt;1.5] = np.nan 也是就地的),而是关于避免分配以便它可以一次性完成行。
【解决方案2】:

另一个让您根据需要进入退货声明的选项:

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

【讨论】:

  • 应该提到:这会创建一个副本。
  • 这是可以避免的,我显示了how。请注意,使用掩码数组方法也很好,我只是认为这值得一提,因为我们在使用 numpy 时经常关心性能和内存使用的细节。
猜你喜欢
  • 2014-01-01
  • 1970-01-01
  • 2019-01-31
  • 2015-10-31
  • 2022-10-01
  • 2020-02-13
  • 2019-11-13
  • 2013-04-22
相关资源
最近更新 更多