311

配列から nan 値を削除する方法を知りたいです。私の配列は次のようになります。

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

nanから値を削除するにはどうすればよいxですか?

4

12 に答える 12

477

配列にnumpyを使用している場合は、使用することもできます

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

同等に

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

[省略形を追加してくれた chbrown に感謝]

説明

内部関数は、数値ではないすべての場所numpy.isnanに値を持つブール/論理配列を返します。反対のことが必要なので、論理否定演算子を使用して、有効な数値であるすべての場所に sを持つ配列を取得します。Truex~Truex

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

于 2012-07-23T21:42:30.267 に答える
67
filter(lambda v: v==v, x)

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

于 2015-04-16T15:46:36.443 に答える
36

これを試して:

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

詳細については、List Comprehensionsを参照してください。

于 2012-07-23T21:39:59.420 に答える
6

上記を行う:

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

また

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

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

y = x[~numpy.isnan(x)]
于 2016-06-23T20:35:51.397 に答える
6

使用している場合numpy

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

# second get the values
x = x[ii]
于 2018-02-16T09:19:02.433 に答える
6

受け入れられた答えは、2次元配列の形を変えます。Pandas dropna()機能を使用して、ここで解決策を提示します。1D および 2D 配列で機能します。2D の場合、weather を選択して、を含む行または列をドロップ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.]
于 2019-03-16T06:37:23.617 に答える