连接具有相同行数但不同列的数组

时间:2020-06-21 12:17:46

标签: python arrays numpy

def preprocess(numerical , categorical):
    imputer = SimpleImputer()
    x_num = imputer.fit_transform(numerical)
    scaler = StandardScaler()
    x_num = scaler.fit_transform(x_num)
    one_hot = OneHotEncoder()
    x_cat = one_hot.fit_transform(categorical)
    print('X_num Shape : ' , x_num.shape)
    print('X_cat Shape : ' , x_cat.shape)
    
    return np.concatenate((x_num,x_cat),axis = 1)
[Output] X_num Shape :  (889, 2)
         X_cat Shape :  (889, 22)

最后显示的错误是ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 0 dimension(s)

我希望输出的形状为(889,24)

最后一句话(索引1的数组的维数为0)使我认为问题与形状为(n,)和(,n)的怪异的numpy数组有关,但这不应该是问题,因为维数是显示不是那样,但我认为我缺少某些东西

我也尝试使用许多不同的功能np.hstack , np.vstack , np.column_stack,但它们要么不提供所需的输出,要么显示此错误消息ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 2 and the array at index 1 has size 1

1 个答案:

答案 0 :(得分:0)

因此,如上面的hpaulj所述,问题是从OneHotEncoder出来后的x_cat的类型为<class 'scipy.sparse.csr.csr_matrix'> 而不是不能与其他numpy数组连接的numpy数组,这导致它被转换连接时,将其转换为一个numpy数组,并且使用shape命令将其尺寸为()。不知道这是否意味着它变平,但是当我尝试使用reshape时,它没有起作用并说ValueError: cannot reshape array of size 1 into shape (889,22)

我要解决的问题是将行one_hot = OneHotEncoder()替换为one_hot = OneHotEncoder(sparse = False),这使输出矩阵的类型成为密集的numpy数组,可以使用np.concatenate((x_num,x_cat),axis = 1 )对其进行串联