【问题标题】:max() and min() returns np.nan when the np array starts with np.nan当 np 数组以 np.nan 开头时,max() 和 min() 返回 np.nan
【发布时间】:2020-04-30 20:54:44
【问题描述】:

如果我有一个以 np.nan 开头的数组,max()min() 函数都返回 np.nan

这是它按预期工作的地方:

>>> column_data = np.array([111, np.nan, 112, np.nan, 115, np.nan, 116, np.nan, 117, np.nan, 118, np.nan, 119])
>>> print(max(column_data))
119.0
>>> print(min(column_data))
111.0

现在我在数组的开头添加了一个np.nan,结果搞砸了

>>> column_data = np.array([np.nan, 111, np.nan, 112, np.nan, 115, np.nan, 116, np.nan, 117, np.nan, 118, np.nan, 119])
>>> print(max(column_data))
nan
>>> print(min(column_data))
nan

我试过过滤掉 nan 元素,但还是一样:

>>> print(max(i for i in column_data if i is not np.nan))
nan
>>> print(min(i for i in column_data if i is not np.nan))
nan

这里发生了什么,我该如何解决?

【问题讨论】:

  • 你期望它做什么?
  • for max() 给我 119 和 min() 给我 111,就像我的第一个例子,它工作正常

标签: python arrays numpy


【解决方案1】:

解决方案和一点解释:

@user2357112supportsMonica 证明了一个观点,“过滤器失败,因为从数组中检索到的表示 NaN 值的对象与 np.nan 不同的对象”:

print(np.nanmin(column_data))
print(np.nanmax(column_data))

输出:

111.0
119.0

请参阅inequality comparison of numpy array with nan to a scalar 了解更多信息。

文档:

documentation's 注释中所述:

传播 NaN 值,即如果至少一项为 NaN,则相应的最大值也将为 NaN。要忽略 NaN 值(MATLAB 行为),请使用 nanmax。

【讨论】:

  • np.nan != np.nan 与此无关。即使事情被更改为np.nan == np.nan,结果也是一样的。过滤器失败,因为从数组中检索到的表示 NaN 值的对象与 np.nan 中的对象不同。
  • 谢谢,这行得通!您是否也知道为什么当数组以 np.nan 开头时它无法工作,但当它不以 np.nan 开头时仍然可以正常工作?
  • @Dan 这是由于处理与nan 值比较的方式。见:stackoverflow.com/questions/25345843/…
  • @Dan 添加了文档链接
【解决方案2】:

这是因为i is not np.nan 从未评估过False,因此没有任何东西被过滤掉。测试nan 的正确方法是使用np.isnan(...)。这应该可以正常工作:

max(i for i in column_data if not np.isnan(i))

此外,您可以使用 numpy 方法执行过滤,最大值和最小值如下:

column_data[~np.isnan(column_data)].max()

但是,如果您只想为非 nan 值计算 maxmin 而对非 nan 值不做任何事情,@U10-Forward 的答案是更好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-25
    • 2022-06-29
    • 1970-01-01
    • 2019-07-30
    • 2017-08-24
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多