BigData

numpy의 concatenate() 함수를 사용할때 zero-dimensional arrays cannot be concatenated 오류

Lcoding 2024. 11. 17. 21:50
반응형

안녕하세요.

 

오늘은 numpy의 concatenate() 함수를 사용할때,

zero-dimensional arrays cannot be concatenated 오류가 발생하는 경우에 대하여 알아보겠습니다.

 

 

 

---  OneHotEncoder ---

from sklearn.preprocessing import OneHotEncoder



X_TRAIN = X_TRAIN.select_dtypes('object').copy()
X_VAL = X_VAL.select_dtypes('object').copy()
X_TEST = X_test.select_dtypes('object').copy()

enc = OneHotEncoder().fit( X_TRAIN )

X_TRAIN_OHE = enc.transform( X_TRAIN)
X_VAL_OHE = enc.transform( X_VAL)
X_TEST_OHE = enc.transform( X_TEST)



 

 

--- StandardScaler ---

from sklearn.preprocessing import StandardScaler

X_TRAIN  = X_TRAIN.select_dtypes(exclude = 'object').copy()
X_VAL = X_VAL.select_dtypes(exclude = 'object').copy()
X_test = X_test.select_dtypes(exclude = 'object').copy()

scale = StandardScaler().fit( X_TRAIN   )

X_TRAIN_SDS = scale.transform( X_TRAIN )
X_VAL_SDS = scale.transform( X_VAL)
X_TEST_SDS = scale.transform( X_test)



 

--- concatenate으로 인코딩과 스케일링된 배열 연결 ---

import numpy as np

X_TRAIN = np.concatenate([X_TRAIN_OHE, X_TRAIN_SDS], axis = 1)
X_VAL = np.concatenate([X_VAL_OHE, X_VAL_SDS, axis = 1)

 

 


위와 같이 진행하는 경우 다음과 같은 에러를 자주 만나게 되는데요.
"zero-dimensional arrays cannot be concatenated"

이 에러에 대한 조치법에 대해 알아보겠습니다.

 

에러 "zero-dimensional arrays cannot be concatenated"는 배열의 차원이 맞지 않아 발생하는 문제입니다.

 

np.concatenate에 전달된 배열 중 일부가 예상과 다른 차원 배열로 변환된 상태일 가능성이 높습니다.

 

- 조치내용 -

1. 각 배열의 차원 확인

먼저 X_TRAIN_OH, X_TRAIN_STD 등 배열들의 차원을 확인합니다:

print(X_TRAIN_OH.shape)  # 희소행렬인 경우 toarray()로 변환 후 shape 확인
print(X_TRAIN_STD.shape)

 

2. 문제 원인 파악 및 해결

(a) X_TRAIN_OH가 희소 행렬인 경우

OneHotEncoder는 기본적으로 결과를 희소 행렬(sparse matrix) 형태로 반환합니다. np.concatenate는 희소 행렬을 지원하지 않기 때문에, 먼저 이를 밀집 배열(dense array)로 변환해야 합니다.

 
X_TRAIN_OH = X_TRAIN_OH.toarray()
X_VAL_OH = X_VAL_OH.toarray()
X_TEST_OH = X_TEST_OH.toarray()

 

(b) X_TRAIN_STD가 1차원 배열인 경우

StandardScaler는 기본적으로 2차원 입력을 출력으로 반환합니다. 그러나 데이터가 단일 열(1차원)인 경우 결과가 (N,) 형태로 반환될 수 있습니다. 이를 2차원으로 변경합니다.

X_TRAIN_STD = X_TRAIN_STD.reshape(-1, 1)
X_VAL_STD = X_VAL_STD.reshape(-1, 1)
X_TEST_STD = X_TEST_STD.reshape(-1, 1)

 

3. 최종 데이터 결합

위의 문제를 해결한 후, 다시 np.concatenate를 사용해 데이터 결합을 시도합니다.

X_TRAIN = np.concatenate([X_TRAIN_OH, X_TRAIN_STD], axis=1)
X_VAL = np.concatenate([X_VAL_OH, X_VAL_STD], axis=1)

 

4. 추가 디버깅 팁

 

문제를 확인하기 위해 배열의 차원과 유형도 확인하면 좋습니다.

print(type(X_TRAIN_OH), X_TRAIN_OH.shape)
print(type(X_TRAIN_STD), X_TRAIN_STD.shape)
print(type(X_VAL_OH), X_VAL_OH.shape)
print(type(X_VAL_STD), X_VAL_STD.shape)

 

5. 최종 확인

위 조치를 완료한다면, 에러 없이 실행될 것입니다.

 

 

감사합니다.

 

반응형