어떻게 numpy 2차원 그룹의 np를nan 값이 지정된 값으로 바뀝니다.

기초 지식:


(1)np.nan은 이 값이 하나의 수가 아니라는 것을 나타낸다. 예를 들어 데이터에서 수입, 나이의 결핍 값이다.np.무한대
(2)np.nan == np.nan의 결과는 False입니다.
(3)nan과 그 어떠한 수의 조작 결과도 모두 nan이다. 예를 들어sum((np.nan, 4)의 결과는nan이다.
(4)ndarray 수조 t1, np를 사용할 수 있습니다.isnan(t1)을 nan 값의 위치로 지정하고 t1[np.isnan(t1)] = 지정한 값으로 nan을 지정한 값으로 바꿉니다
(5)np.nan_to_num(t1), t1의 nan을 0으로 바꿀 수 있습니다
(6)t1[t1==t1]은 모든 nan을 제거하고 비nan 값만 보존할 수 있다
현재 3*4의 수조를 생성하여 첫 번째 줄을 설정하고 2, 3열 위치의 두 원소는 np입니다.nan

import numpy as np
t1 = np.arange(12).reshape(3,4).astype('float')
t1[1,2:] = np.nan
print(t1)
[[ 0. 1. 2. 3.]
[ 4. 5. nan nan]
[ 8. 9. 10. 11.]]

1. 질문 1:


t1의 nan을 0으로 바꾸는 방법

# 1:
for i in range(t1.shape[1]):
    col = t1[:,i]
    col[np.isnan(col)] = 0
# 2: np.nan_to_num 
t1 = np.nan_to_num(t1)
# 3: np.isnan(t1) , , 
t1[np.isnan(t1)] = 0
메서드 3은 0뿐만 아니라 다른 값으로도 바꿀 수 있으므로 권장합니다.

2. 질문 2:


t1의 nan을 계산 후의 값으로 바꾸는 방법, 예를 들어 이 열의 모든 비nan 요소의 평균 값으로 바꾸는 것
원본 데이터에서 누락된 값을 0으로 바꾸는 것이 때때로 반드시 적합한 것은 아니다.예를 들어 원시 데이터 중 일부의 나이가 채워지지 않고 0으로 바뀌면 앞으로 연령 평균치를 계산하거나 데이터 분석을 할 때 불합리한 결과가 발생할 것이다.이때 나이가 부족한 사람의 나이를 균일치로 설정하는 것이 합리적이다.

(1) 메서드 1


# 1:
for i in range(t1.shape[1]):
    col = t1[:,i]
    # nan, np.nan np.nan, nan, col!=col True,np.count_nonzero True , nan
    nan_num = np.count_nonzero(col != col)
    if nan_num:
        not_nan_col = col[col == col] # col == col , False 。
        col[np.isnan(col)] = not_nan_col.mean()
print(t1)
실행 결과:
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]

(2) 방법2


# 2:np.nanmean nan , np.nanmax, np.nanmin 。 :
mean = np.nanmean(t1,axis=0)
print(' :%s' %mean)
for i in range(t1.shape[1]):
    col = t1[:,i]
    col[np.isnan(col)] = mean[i]
print(t1)
실행 결과

(3) 방법3


기능이 강한pandas 라이브러리 사용하기

# pandas , 
import pandas as pd
df = pd.DataFrame(t1)
t1 = df.fillna(df.mean()).values  #values as_matrix(), DataFrame ndarray
print(t1)
실행 결과가 같습니다.
추가:python Numpy의 Nan(빈 값) 및 inf(무한 값) 빠른 교체
데이터 처리를 할 때 데이터의 개수가 변하지 않도록 하기 때문에 데이터 중의 빈 값과 무한한 값을 지정한 값(여기는 255)으로 교체해야 한다. 데이터의 양이 비교적 많은 것을 고려하면 (50000000개의 데이터) 효율도 하나의 고려 요소이다.

다음은 주로 데이터를 교체하는 핵심 코드를 제시했다


# +--+--+--+--+--+--+--+--+--+--+
print('Predict New Data......')
start = datetime.datetime.now()

dataPre = input_Data   #  

# 0: 00:23.012951   ( 50000000 )
dataPre0 = np.array(dataPre)
dataPre0[np.isnan(dataPre0)] = 255
dataPre0[np.isinf(dataPre0)] = 255

# 0:02:03.038840
dataPre1 = (dataPre)
dataPre1 = dataPre1.replace([np.inf, -np.inf], np.nan)
dataPre1 = dataPre1.fillna(value = 255)

# 0:02:03.140287
dataPre2 = (dataPre)
dataPre2 = (dataPre2.replace([np.inf, -np.inf], np.nan)).fillna(value = 255)    # shi yong te ding shuju tian chong

# 0:00:30.346661
dataPre3 = np.array(dataPre)
dataPre3[(dataPre3 == float('inf')) | (dataPre3 == float('-inf')) | (dataPre3 == float('nan'))] = 255

# 0:00:19.702519
dataPre4 = np.array(dataPre)
dataPre4[np.isinf(dataPre4)] = np.nan  #  
dataPre4[np.isnan(dataPre4)] = 255  # #  nan 255

# 0:01:10.404677
dataPre5 = np.array(dataPre)
dataPre5 = np.where(np.isnan(dataPre5), 255, dataPre5)
dataPre5 = np.where(np.isinf(dataPre5), 255, dataPre5)
몇 가지 방법의 효율 차이가 비교적 크다는 것을 알 수 있다. 특히 Replace나 np를 사용했다.where 함수의 방법은 비교적 느리다.
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.

좋은 웹페이지 즐겨찾기