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