numpy.ndarray稀疏矩阵到密集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy.ndarray稀疏矩阵到密集相关的知识,希望对你有一定的参考价值。

我想在一些数据上运行sklearnRandomForestClassifier,这些数据被打包为恰好稀疏的numpy.ndarray。调用fitValueError: setting an array element with a sequence.。从其他帖子我了解随机森林无法处理稀疏数据。

我希望对象有一个todense方法,但事实并非如此。

>>> X_train
array(<1443899x1936774 sparse matrix of type '<class 'numpy.float64'>'
    with 141256894 stored elements in Compressed Sparse Row format>,
      dtype=object)
>>> type(X_train)
<class 'numpy.ndarray'>

我尝试用SciPy csr_matrix包装它,但也会出错。

有没有办法让随机森林接受这些数据? (不确定密集会真正适合记忆,但那是另一回事......)

编辑1

生成错误的代码就是这样:

X_train = np.load('train.npy') # this returns a ndarray
train_gt = pd.read_csv('train_gt.csv')

model = RandomForestClassifier()
model.fit(X_train, train_gt.target)

至于使用toarray()的建议,ndarray没有这样的方法。 AttributeError: 'numpy.ndarray' object has no attribute 'toarray'

而且,如上所述,对于这个特定的数据,我需要太字节的内存来保存数组。有没有选择用稀疏数组运行RandomForestClassifier

编辑2

似乎应该使用SciPy的稀疏数据保存数据,如Save / load scipy sparse csr_matrix in portable data format所述。使用NumPy的保存/加载时,应该保存更多数据。

答案

我相信你正在寻找toarray方法,如documentation所示。

所以你可以做,例如,X_dense = X_train.toarray()

当然,那么你的计算机崩溃了(除非你有必要的22TB内存?)。

另一答案
>>> X_train
array(<1443899x1936774 sparse matrix of type '<class 'numpy.float64'>'
    with 141256894 stored elements in Compressed Sparse Row format>,
      dtype=object)

意味着你的代码或它所调用的东西已经完成了np.array(M),其中M是一个csr稀疏矩阵。它只是将该矩阵包装在一个对象dtype数组中。

要在不采用稀疏矩阵的代码中使用稀疏矩阵,必须先将它们转换为密集:

 arr = M.toarray()    # or M.A same thing
 mat = M.todense()    # to make a np.matrix

但考虑到非零元素的维数和数量,这种转换可能会产生一个memory error

另一答案

似乎应该使用SciPy的稀疏数据保存数据,如Save / load scipy sparse csr_matrix in portable data format所述。使用NumPy的保存/加载时,应该保存更多数据。

RandomForestClassifier可以使用此格式的数据运行。代码现在运行1:30h,所以希望它实际上会完成:-)

以上是关于numpy.ndarray稀疏矩阵到密集的主要内容,如果未能解决你的问题,请参考以下文章

使用密集和稀疏矩阵

将犰狳中的矩阵从稀疏转换为密集(spmat 到 mat)

稀疏矩阵与密集矩阵乘法 C++ Tensorflow

稀疏 x 密集矩阵乘以 Armadillo 出乎意料地慢

来自密集张量 Tensorflow 的稀疏张量(矩阵)

来自密集的Tensorflow的稀疏矩阵