nan 값을 0으로 변환
2D numpy 배열이 있습니다. 이 배열의 일부 값은 NaN
. 이 배열을 사용하여 특정 작업을 수행하고 싶습니다. 예를 들어 배열을 고려하십시오.
[[ 0. 43. 67. 0. 38.]
[ 100. 86. 96. 100. 94.]
[ 76. 79. 83. 89. 56.]
[ 88. NaN 67. 89. 81.]
[ 94. 79. 67. 89. 69.]
[ 88. 79. 58. 72. 63.]
[ 76. 79. 71. 67. 56.]
[ 71. 71. NaN 56. 100.]]
각 행을 한 번에 하나씩 가져 와서 역순으로 정렬하여 행에서 최대 3 개의 값을 가져와 평균을 가져 오려고합니다. 내가 시도한 코드는 다음과 같습니다.
# nparr is a 2D numpy array
for entry in nparr:
sortedentry = sorted(entry, reverse=True)
highest_3_values = sortedentry[:3]
avg_highest_3 = float(sum(highest_3_values)) / 3
이 포함 된 행에는 작동하지 않습니다 NaN
. 제 질문은 NaN
2D numpy 배열에서 모든 값을 0 으로 변환하는 빠른 방법이 있으므로 정렬 및 수행하려는 다른 작업에 문제가 없습니다.
이것은 작동합니다.
from numpy import *
a = array([[1, 2, 3], [0, 3, NaN]])
where_are_NaNs = isnan(a)
a[where_are_NaNs] = 0
위의 경우 where_are_NaNs는 다음과 같습니다.
In [12]: where_are_NaNs
Out[12]:
array([[False, False, False],
[False, False, True]], dtype=bool)
A
2D 어레이는 어디에 있습니까?
import numpy as np
A[np.isnan(A)] = 0
이 함수 isnan
는 NaN
값이 있는 위치를 나타내는 bool 배열을 생성합니다 . 부울 배열은 동일한 모양의 배열을 인덱싱하는 데 사용할 수 있습니다. 마스크처럼 생각하십시오.
방법에 대한 nan_to_num () ?
사용에 대한 drake의 답변 에 대한 코드 예제 nan_to_num
:
>>> import numpy as np
>>> A = np.array([[1, 2, 3], [0, 3, np.NaN]])
>>> A = np.nan_to_num(A)
>>> A
array([[ 1., 2., 3.],
[ 0., 3., 0.]])
당신이 np.where
있는 곳을 찾는 데 사용할 수 있습니다 NaN
:
import numpy as np
a = np.array([[ 0, 43, 67, 0, 38],
[ 100, 86, 96, 100, 94],
[ 76, 79, 83, 89, 56],
[ 88, np.nan, 67, 89, 81],
[ 94, 79, 67, 89, 69],
[ 88, 79, 58, 72, 63],
[ 76, 79, 71, 67, 56],
[ 71, 71, np.nan, 56, 100]])
b = np.where(np.isnan(a), 0, a)
In [20]: b
Out[20]:
array([[ 0., 43., 67., 0., 38.],
[ 100., 86., 96., 100., 94.],
[ 76., 79., 83., 89., 56.],
[ 88., 0., 67., 89., 81.],
[ 94., 79., 67., 89., 69.],
[ 88., 79., 58., 72., 63.],
[ 76., 79., 71., 67., 56.],
[ 71., 71., 0., 56., 100.]])
nan은 결코 nan과 같지 않습니다.
if z!=z:z=0
그래서 2D 배열의 경우
for entry in nparr:
if entry!=entry:entry=0
numpy.nan_to_num 사용할 수 있습니다 .
numpy.nan_to_num (x) : nan 을 0으로 , inf 를 유한 숫자로 바꿉니다 .
예 (문서 참조) :
>>> np.set_printoptions(precision=8)
>>> x = np.array([np.inf, -np.inf, np.nan, -128, 128])
>>> np.nan_to_num(x)
array([ 1.79769313e+308, -1.79769313e+308, 0.00000000e+000,
-1.28000000e+002, 1.28000000e+002])
1D 배열의 예인 람다 함수를 사용할 수 있습니다.
import numpy as np
a = [np.nan, 2, 3]
map(lambda v:0 if np.isnan(v) == True else v, a)
결과를 얻을 수 있습니다.
[0, 2, 3]
For your purposes, if all the items are stored as str
and you just use sorted as you are using and then check for the first element and replace it with '0'
>>> l1 = ['88','NaN','67','89','81']
>>> n = sorted(l1,reverse=True)
['NaN', '89', '88', '81', '67']
>>> import math
>>> if math.isnan(float(n[0])):
... n[0] = '0'
...
>>> n
['0', '89', '88', '81', '67']
참고URL : https://stackoverflow.com/questions/5124376/convert-nan-value-to-zero
'Development Tip' 카테고리의 다른 글
JDBC batch insert performance (0) | 2020.11.25 |
---|---|
Swift iOS에서 기기 방향 설정 (0) | 2020.11.25 |
주어진 값이 양수인지 음수인지 확인하는 방법은 무엇입니까? (0) | 2020.11.25 |
Jekyll 설치 오류-기본 확장 빌드 (0) | 2020.11.25 |
뒤로 버튼을 감지하지만 dialogfragment를 닫지 않음 (0) | 2020.11.25 |