回答:
numpyを配列に使用している場合は、
x = x[numpy.logical_not(numpy.isnan(x))]
同等に
x = x[~numpy.isnan(x)]
[追加された省略表現についてchbrownに感謝]
説明
内部関数numpy.isnan
は、数値True
でx
はないあらゆる場所に値を持つブール/論理配列を返します。反対が欲しいので、論理的否定演算子を使用して、有効な数値であるすべての場所にsを~
含む配列を取得します。True
x
最後に、この論理配列を使用して元の配列にインデックスを付け、x
NaN以外の値のみを取得します。
x = x[numpy.isfinite(x)]
x = x[~numpy.isnan(x)]
、これはmutzmatronの元の回答と同等ですが、短くなります。無限を維持したい場合numpy.isfinite(numpy.inf) == False
は、もちろんそれを知っておいてください~numpy.isnan(numpy.inf) == True
。
np.where(np.isfinite(x), x, 0)
x
配列ではないために発生しています。論理インデックスを使用する場合は、配列にする必要があります-例x = np.array(x)
filter(lambda v: v==v, x)
NaNの場合のみv!= vなので、リストとnumpy配列の両方で機能します
x
タイプのソリューションとは対照的に、一度だけ指定する必要があるため、これも役立ちますx[~numpy.isnan(x)]
。これはx
、長い式で定義されていて、この長い式の結果を格納する一時変数を作成してコードを煩雑にしたくない場合に便利です。
print ([value for value in x if not math.isnan(value)])
np
パッケージ:だからはNaNをせずに、あなたのリストを返します:[value for value in x if not np.isnan(value)]
私にとっては@jmetzの答えはうまくいきませんでしたが、pandas isnull()を使うとうまくいきました。
x = x[~pd.isnull(x)]
上記を行う:
x = x[~numpy.isnan(x)]
または
x = x[numpy.logical_not(numpy.isnan(x))]
同じ変数(x)にリセットしても実際のnan値は削除されず、別の変数を使用する必要があることがわかりました。別の変数に設定すると、ナンが削除されました。例えば
y = x[~numpy.isnan(x)]
x
、新しい値で上書きする必要があります(つまり、NaNなし...) 。なぜこれが起こり得るのかについて、もっと詳しい情報を提供できますか?
他の人が示すように
x[~numpy.isnan(x)]
動作します。しかし、numpy dtypeがネイティブデータ型でない場合、たとえばオブジェクトである場合は、エラーがスローされます。その場合、パンダを使用できます。
x[~pandas.isna(x)] or x[~pandas.isnull(x)]
受け入れ答えは、2Dアレイの形状を変化させます。ここでは、Pandasのdropna()機能を使用したソリューションを紹介します。1Dおよび2Dアレイで機能します。2Dの場合、天候を選択して、を含む行または列をドロップできますnp.nan
。
import pandas as pd
import numpy as np
def dropna(arr, *args, **kwarg):
assert isinstance(arr, np.ndarray)
dropped=pd.DataFrame(arr).dropna(*args, **kwarg).values
if arr.ndim==1:
dropped=dropped.flatten()
return dropped
x = np.array([1400, 1500, 1600, np.nan, np.nan, np.nan ,1700])
y = np.array([[1400, 1500, 1600], [np.nan, 0, np.nan] ,[1700,1800,np.nan]] )
print('='*20+' 1D Case: ' +'='*20+'\nInput:\n',x,sep='')
print('\ndropna:\n',dropna(x),sep='')
print('\n\n'+'='*20+' 2D Case: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna (rows):\n',dropna(y),sep='')
print('\ndropna (columns):\n',dropna(y,axis=1),sep='')
print('\n\n'+'='*20+' x[np.logical_not(np.isnan(x))] for 2D: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna:\n',x[np.logical_not(np.isnan(x))],sep='')
結果:
==================== 1D Case: ====================
Input:
[1400. 1500. 1600. nan nan nan 1700.]
dropna:
[1400. 1500. 1600. 1700.]
==================== 2D Case: ====================
Input:
[[1400. 1500. 1600.]
[ nan 0. nan]
[1700. 1800. nan]]
dropna (rows):
[[1400. 1500. 1600.]]
dropna (columns):
[[1500.]
[ 0.]
[1800.]]
==================== x[np.logical_not(np.isnan(x))] for 2D: ====================
Input:
[[1400. 1500. 1600.]
[ nan 0. nan]
[1700. 1800. nan]]
dropna:
[1400. 1500. 1600. 1700.]
最も簡単な方法は次のとおりです。
numpy.nan_to_num(x)
ドキュメント:https : //docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html
NaN
sを大きな数に置き換えますが、OPは要素を完全に削除するように求めました。