2016-08-18 25 views
0

Numpyのnanmax関数を使用して、行列の列にあるすべてのnon-nan値の最大値を取得しようとしました。最大値はナノです。しかし、すべての列にnon-nan値があり、max(x、na.rm = T)でRで同じことを試したことを確認するだけで、すべてがうまくいきます。Python Numpy nanmax()は、配列内に非ナノ値がある場合に返す。

これはなぜ発生するのですか?私は考えることができる唯一のことは、私はパンダフレームから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

ショーaはサンプル行列、および結果を表示します。 – Daniel

+2

あなたの結果を示す最小限の行列と問題を引き起こしているコードの両方を投稿しない限り、できることはほとんどありません。この質問は非常に曖昧です。 –

+0

このスレッドは最初の2人のコメント作成者が要求した例をうまく示しています。 http://stackoverflow.com/help/mcve – andrew

答えて

2
あなたの配列は、配列内の要素を意味 object配列は、任意のPythonあるさ

オブジェクト。 Pandasはオブジェクト配列を使用するので、Pandas DataFrameをnumpy配列に変換すると、結果はオブジェクト配列になります。 nanmax()はオブジェクト配列を正しく処理しません。

ここには、numpy.matrixnumpy.ndarrayを使用する2つの例があります。 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シェルで配列を表示すると、dtype=objectが表示されます。またはa.dtypeを確認できます。 aがオブジェクト配列の場合は、dtype('O')またはobject(dtypeのstr()またはrepr()を表示するかどうかによって異なります)が表示されます。

アレイ内のすべての値が、実際には、浮動小数点値を、これを回避する方法は、第1の浮動小数点値の配列にオブジェクト配列へ変換することであると仮定すると:

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 
関連する問題