답변:
배열에 numpy를 사용하는 경우 다음을 사용할 수도 있습니다
x = x[numpy.logical_not(numpy.isnan(x))]
동등하게
x = x[~numpy.isnan(x)]
[추가 된 속기 덕분에 chbrown에게 감사합니다]
설명
내부 함수 는 숫자가 아닌 모든 numpy.isnan
값을 갖는 부울 / 논리 배열을 반환합니다 . 우리가 반대 할 때, 우리는 논리되지 연산자를 사용 과 배열을 가져 오는 그 모든 곳들 입니다 유효한 번호.True
x
~
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
이 numpy 배열이 아니기 때문에 발생합니다 . 논리적 인덱싱을 사용하려면 배열이어야합니다. 예 :x = np.array(x)
filter(lambda v: v==v, x)
v! = v 이후 NaN에 대해서만리스트와 numpy 배열에 모두 작동합니다.
x
유형의 솔루션과 달리 한 번만 지정하면 되므로 유용 합니다 x[~numpy.isnan(x)]
. 이것은 x
긴 표현식으로 정의 될 때 편리 하며이 긴 표현식의 결과를 저장하기 위해 임시 변수를 작성하여 코드를 어지럽히고 싶지 않습니다.
이 시도:
import math
print [value for value in x if not math.isnan(value)]
자세한 내용은 List Comprehensions를 참조하십시오 .
print ([value for value in x if not math.isnan(value)])
np
패키지 와 함께이 목록 이해 답변을 사용할 수 있습니다 . 따라서 nans없이 목록을 반환합니다.[value for value in x if not np.isnan(value)]
나에게 @jmetz의 대답은 효과가 없었지만 팬더를 사용하면 isnull ()을 사용했습니다.
x = x[~pd.isnull(x)]
위를 수행 :
x = x[~numpy.isnan(x)]
또는
x = x[numpy.logical_not(numpy.isnan(x))]
동일한 변수 (x)로 재설정해도 실제 nan 값이 제거되지 않고 다른 변수를 사용해야한다는 것을 알았습니다. 다른 변수로 설정하면 nan이 제거되었습니다. 예 :
y = x[~numpy.isnan(x)]
다른 사람들이 보듯이
x[~numpy.isnan(x)]
공장. 그러나 numpy dtype이 기본 데이터 유형이 아닌 경우 (예 : 객체 인 경우) 오류가 발생합니다. 이 경우 팬더를 사용할 수 있습니다.
x[~pandas.isna(x)] or x[~pandas.isnull(x)]
허용 대답은 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.]
가장 간단한 방법은 다음과 같습니다.
numpy.nan_to_num(x)
설명서 : https://docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html
NaN
s를 많은 수로 대체 하는 반면 OP는 요소를 완전히 제거하도록 요청했습니다.
@jmetz의 답변 은 아마도 대부분의 사람들이 필요로하는 것입니다. 그러나 1 차원 배열을 생성합니다. 예를 들어 행렬에서 전체 행이나 열을 제거 할 수 없게합니다.
그렇게하려면 논리 배열을 1 차원으로 줄이고 대상 배열을 색인화해야합니다. 예를 들어, 다음은 하나 이상의 NaN 값을 가진 행을 제거합니다.
x = x[~numpy.isnan(x).any(axis=1)]