![](/img/trans.png)
[英]Numpy Array operations returning NaN values; despite no NaN values in input
[英]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.