numpy의 concatenate() 함수를 사용할때 zero-dimensional arrays cannot be concatenated 오류
안녕하세요.
오늘은 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. 최종 확인
위 조치를 완료한다면, 에러 없이 실행될 것입니다.
감사합니다.