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

时间:2016-08-18 18:05:04

标签: python numpy

我尝试使用Numpy的nanmax函数来获得矩阵列中所有非纳米值的最大值,因为有些它可以工作,有些则返回nan作为最大值。但是,每列中都有非纳米值,只是为了确保我在R中用max(x,na.rm = T)尝试相同的东西,一切都很好。

任何人都有为何会出现这种情况的想法?我能想到的唯一一件事是我从熊猫框架转换了numpy矩阵,但我真的没有线索......

Option Compare Database
Option Explicit

Sub so38999346()
    DoCmd.TransferDatabase acLink, "ODBC Database", "ODBC;DSN=PostgreSQL35W", acTable, _
            "public.hodor_hodor_hodor_hodor_hodor_hodor_hodor_hodor_hodor_hodor", _
            "hodor_linked_table"
End Sub

1 个答案:

答案 0 :(得分:2)

您的数组是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() dtype)。

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

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