web-dev-qa-db-ja.com

配列からnan値を削除する

配列からnan値を削除する方法を見つけたいと思います。私の配列はこんな感じです:

x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration

nanからxの値を削除する方法を教えてください。

162
Dax Feliz

もしあなたがあなたの配列にテンキーを使っているならば、あなたも使うことができます。

x = x[numpy.logical_not(numpy.isnan(x))]

同等に

x = x[~numpy.isnan(x)]

[追加された速記を寄せてくれたchbrownに感謝]

説明

内側の関数numpy.isnanは、Trueが非数値であるところではどこでも値xを持つブール値/論理配列を返します。反対にしたいので、Trueが有効な数値であるところでxsを持つ配列を得るために論理否定演算子~を使います。

最後に、この論理配列を使用して、元の配列xにインデックスを付け、NaN以外の値だけを取得します。

281
jmetz
filter(lambda v: v==v, x)

v!= vはNaNに対してのみであるため、リストとnumpy配列の両方に機能します

41
udibr

これを試して:

import math
print [value for value in x if not math.isnan(value)]

詳しくは、 リスト内包表記 をお読みください。

32
liori

私にとっては@jmetzによる答えはうまくいきませんでしたが、pandas isnull()を使えばうまくいきました。

x = x[~pd.isnull(x)]
14
Daniel Kislyuk

上記のことをする:

x = x[~numpy.isnan(x)]

または

x = x[numpy.logical_not(numpy.isnan(x))]

同じ変数(x)にリセットしても実際のnan値は削除されず、別の変数を使用する必要があることがわかりました。別の変数に設定すると、ナンが削除されました。例えば.

y = x[~numpy.isnan(x)]
6
melissaOu

他の人に見られるように

x[~numpy.isnan(x)]

動作します。しかし、numpy dtypeがネイティブデータ型ではない場合、例えばそれがオブジェクトである場合はエラーになります。その場合はパンダを使うことができます。

x[~pandas.isnan(x)]
2
koliyat9811

numpyを使用している場合

# first get the indices where the values are finite
ii = np.isfinite(x)

# second get the values
x = x[ii]
1
aloha

承認された答え は、2次元配列の形状を変更します。ここでは、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.]
0
Markus Dutschke

これは私のNaNとinfsの ndarray "X"へのアプローチです。

次のようにNaNinfを付けずに行のマップを作成します。

idx = np.where((np.isnan(X)==False) & (np.isinf(X)==False))

idxはタプルです。 2番目の列(idx[1])には、配列のインデックスが含まれます。ここで、noNaNまたはinfは行全体で見つかります。

その後:

filtered_X = X[idx[1]]

filtered_XはX を含まず NaNinfも含みません。

0
aerijman