使用`np.concatenate`将一个numpy数组与一个稀疏矩阵连接起来。

8
一个数据集包含数字和类别变量,我将它们分为两部分:
cont_data = data[cont_variables].values
disc_data = data[disc_variables].values

然后我使用 sklearn.preprocessing.OneHotEncoder 来编码分类数据,接着我尝试将编码后的分类数据与数值数据合并:

np.concatenate((cont_data, disc_data_coded), axis=1)

但是出现了以下错误:
ValueError: all the input arrays must have same number of dimensions

我确保维度的数量相等:

print(cont_data.shape)        # (24000, 35)
print(disc_data_coded.shape)  # (24000, 26)

最后,我发现cont_data是一个numpy数组

>>> disc_data_coded
<24000x26 sparse matrix of type '<class 'numpy.float64'>'
with 312000 stored elements in Compressed Sparse Row format>

我将OneHotEncoder中的参数sparse改为False,一切正常。 但问题是,如何直接合并numpy数组sparse矩阵,而不需要设置sparse=False

1个回答

12
稀疏矩阵不是numpy数组的子类,因此numpy方法经常无法使用。请改用稀疏函数,例如 sparse.vstack和sparse.hstack。但是所有输入都必须是稀疏的。
或者首先将稀疏矩阵变为密集矩阵,使用.toarray()方法,并使用np.concatenate。
你想要结果是稀疏的还是密集的?
In [32]: sparse.vstack((sparse.csr_matrix(np.arange(10)),sparse.csr_matrix(np.on
    ...: es((3,10)))))
Out[32]: 
<4x10 sparse matrix of type '<class 'numpy.float64'>'
    with 39 stored elements in Compressed Sparse Row format>
In [33]: np.concatenate((sparse.csr_matrix(np.arange(10)).A,np.ones((3,10))))
Out[33]: 
array([[0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])

仅供参考,这里的sparsescipy中的一个子模块。要运行上面的代码,只需要添加:from scipy import sparse - htredleaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接