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

Python Numpy nanmax()在数组中存在非nan值时返回nan,python,numpy,Python,Numpy,我尝试使用Numpy的nanmax函数来获取矩阵列中所有非nan值的max,对于某些情况,它可以工作,对于某些情况,它返回nan作为最大值。然而,每一列中都有非nan值,为了确保我在R中尝试了相同的方法,使用max(x,na.rm=T),并且在那里一切都很好 有人知道为什么会这样吗?我能想到的唯一一件事是,我将numpy矩阵从熊猫框架转换而来,但我真的没有任何线索 np.nanmax(datamatrix, axis=0) matrix([[1, 101, 193, 1, 163.0, 10.

我尝试使用Numpy的nanmax函数来获取矩阵列中所有非nan值的max,对于某些情况,它可以工作,对于某些情况,它返回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)

您的数组是一个
对象
数组,这意味着数组中的元素是任意python对象。Pandas使用对象数组,因此当您将Pandas数据帧转换为numpy数组时,结果可能是一个对象数组
nanmax()
无法正确处理对象数组

这里有两个示例,一个使用
numpy.matrix
,另一个使用
numpy.ndarray
。使用
矩阵
,当出现问题时,您根本不会收到任何警告:

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

您的数组是一个
对象
数组,这意味着数组中的元素是任意python对象。Pandas使用对象数组,因此当您将Pandas数据帧转换为numpy数组时,结果可能是一个对象数组
nanmax()
无法正确处理对象数组

这里有两个示例,一个使用
numpy.matrix
,另一个使用
numpy.ndarray
。使用
矩阵
,当出现问题时,您根本不会收到任何警告:

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

显示一个示例矩阵和结果。除非您同时发布一个显示结果的最小矩阵和导致问题的代码,否则我们无能为力。这个问题非常模糊。这个线程很好地说明了前两位评论者要求的示例:
nanmax()
可能无法正确处理对象数组。如果
x
是数组,请选中
x.dtype
。Pandas使用对象数组,因此如果从Pandas数据帧转换,您的数组也可能是对象数组。例如,
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
。显示示例矩阵,结果。除非你发布一个最小矩阵来显示你的结果和导致问题的代码,否则我们无能为力。这个问题非常模糊。这个线程很好地说明了前两位评论者要求的示例:
nanmax()
可能无法正确处理对象数组。如果
x
是数组,请选中
x.dtype
。Pandas使用对象数组,因此如果从Pandas数据帧转换,您的数组也可能是对象数组。例如,
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