어떻게 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 함수의 방법은 비교적 느리다.이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
chainer의 connection을 괴롭히고 새로운 층을 만든다 (1)GPU GTX1070 우분투 14.04 chainer 1.14.0 chainer에서 최신 모델을 구현할 때는 links/connection이나 functions/connection을 괴롭힐 필요가 있다. 그래서 가장...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.