繁体   English   中英

当数组中存在非nan值时,Python Numpy nanmax()返回nan

[英]Python Numpy nanmax() returning nan when there are non nan values in the array

我尝试使用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)

您的数组是一个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 (取决于最终看到的是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM