Development Tip

nan 값을 0으로 변환

yourdevel 2020. 11. 25. 21:19
반응형

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. 제 질문은 NaN2D 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)

A2D 어레이는 어디에 있습니까?

import numpy as np
A[np.isnan(A)] = 0

이 함수 isnanNaN값이 있는 위치를 나타내는 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) : nan0으로 , 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

반응형