2016-08-18 227 views
0

我嘗試使用Numpy的nanmax函數來獲取矩陣列中所有非nan值的最大值,對於某些工作而言,它對於某些值返回nan作爲最大值。然而,在每列中都有非nan值,並且只是爲了確保我在R中用max(x,na.rm = T)嘗試了同樣的事情,並且在那裏一切都很好。Python Numpy nanmax()在數組中存在非nan值時返回nan

任何人有任何想法,爲什麼會發生這種情況?我能想到的唯一的事情就是我轉換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) 
+2

示出了樣本矩陣和結果。 – Daniel

+2

除非您同時發佈顯示結果的最小矩陣和導致問題的代碼,否則我們無能爲力。這個問題現在非常模糊。 –

+0

此線程很好地說明了前兩個請求者請求的示例: http://stackoverflow.com/help/mcve – andrew

回答

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(取決於您是否最終看到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