【问题标题】:Python Numpy nanmax() returning nan when there are non nan values in the array当数组中有非 nan 值时,Python Numpy nanmax() 返回 nan
【发布时间】:2016-08-18 18:05:04
【问题描述】:

我尝试使用 Numpy 的 nanmax 函数来获取矩阵列中所有非 nan 值的最大值,对于某些它有效,对于某些它返回 nan 作为最大值。但是,每一列中都有非 nan 值,只是为了确保我在 R 中使用 max(x, na.rm = T) 尝试了同样的事情并且那里一切都很好。

有人知道为什么会发生这种情况吗?我唯一能想到的是我从熊猫框架中转换了 numpy 矩阵,但我真的不知道......

np.nanmax(datamatrix, axis=0)

matrix([[1, 101, 193, 1, 163.0, 10.6, nan, 4.7, 142.0, 0.47, 595.0,
         170.0, 5.73, 24.0, 27.0, 23.0, 361.0, 33.0, 94.0, 9.2, 16.8, nan,
         nan, 91.0, nan, nan, nan, nan, 0.0, 105.0, nan, nan, nan, nan,nan,
         nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
         nan, nan, nan, nan, nan, nan, nan, nan]], dtype=object)

【问题讨论】:

  • 显示样本矩阵和结果。
  • 除非您同时发布显示结果的最小矩阵和导致问题的代码,否则我们无能为力。这个问题目前非常模糊。
  • 这个帖子很好地说明了前两位评论者要求的例子:stackoverflow.com/help/mcve
  • nanmax() 可能无法正确处理对象数组。如果x 是数组,请检查x.dtype。 Pandas 使用对象数组,因此如果您从 Pandas DataFrame 转换,您的数组也可能是对象数组。
  • 例如,np.nanmax(np.array([2.0, np.nan, np.nan])) 按预期返回 2.0,但 np.nanmax(np.array([2.0, np.nan, np.nan], dtype=object)) 生成警告并返回 nan

标签: python numpy


【解决方案1】:

您的数组是object 数组,这意味着数组中的元素是任意python 对象。 Pandas 使用对象数组,因此当您将 Pandas DataFrame 转换为 numpy 数组时,结果很可能是对象数组。 nanmax() 没有正确处理对象数组。

这里有几个例子,一个使用numpy.matrix,一个使用numpy.ndarray。使用matrix,您根本不会收到任何警告:

In [1]: import numpy as np

In [2]: m = np.matrix([[2.0, np.nan, np.nan]], dtype=object)

In [3]: np.nanmax(m)
Out[3]: nan

使用数组时,您会收到一个神秘的警告,但仍会返回 nan

In [4]: a = np.array([[2.0, np.nan, np.nan]], dtype=object)

In [5]: np.nanmax(a)
/Users/warren/miniconda3scipy/lib/python3.5/site-packages/numpy/lib/nanfunctions.py:326: RuntimeWarning: All-NaN slice encountered
  warnings.warn("All-NaN slice encountered", RuntimeWarning)
Out[5]: nan

您可以通过几种方式确定您的数组是否为对象数组。当您在交互式 python 或 ipython shell 中显示数组时,您将看到dtype=object。或者您可以查看a.dtype;如果a 是一个对象数组,您将看到dtype('O')object(取决于您最终看到的是dtype 的str() 还是repr())。

假设数组中的所有值实际上都是浮点值,解决此问题的一种方法是首先从对象数组转换为浮点值数组:

In [6]: b = a.astype(np.float64)

In [7]: b
Out[7]: array([[  2.,  nan,  nan]])

In [8]: np.nanmax(b)
Out[8]: 2.0

In [9]: n = m.astype(np.float64)

In [10]: np.nanmax(n)
Out[10]: 2.0

【讨论】:

    猜你喜欢
    • 2020-06-04
    • 2017-08-12
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多