我有一个非常大的稀疏矩阵(100000列和100000行)。我想选择这个稀疏矩阵的一些行,然后用它们来形成一个新的稀疏矩阵。我试图先把它们转换成稠密矩阵,然后再转换成稀疏矩阵。但当我这么做的时候,python会产生一个“内存错误”。然后我尝试了另一种方法,我选择稀疏矩阵的行,然后将它们放入一个数组中,但是当我试图将这个数组转换为稀疏矩阵时,它会说:‘ValueError:一个包含多个元素的数组的真值是不明确的。使用a.any()或a.all()。' 那么如何将这个列表稀疏矩阵转换成一个大的稀疏矩阵呢?在
# X_train is a sparse matrix of size 100000x100000, it is in sparse form
# y_train is a 1 denmentional array with length 100000
# I try to get a new sparse matrix by using some rows of X_train, the
#selection criteria is sum of the sparse row = 0
#y_train_new = []
#X_train_new = []
for i in range(len(y_train)):
if np.sum(X_train[i].toarray()[0]) == 0:
X_train_new.append(X_train[i])
y_train_new.append(y_train[i])
当我这样做的时候:
^{pr2}$我收到错误信息:
'ValueError: The truth value of an array with more than one element is
ambiguous. Use a.any() or a.all().'
我添加了一些标签,可以帮助我更快地看到你的问题。在
当询问错误时,最好提供部分或全部的回溯,这样我们就可以看到错误发生的位置。有关问题函数调用的输入信息也有帮助。在
幸运的是,我可以相当容易地重现这个问题,而且是一个大小合理的例子。不需要做一个10万x10000矩阵,没有人可以看!在
制作一个中等大小的稀疏矩阵:
我可以计算整个矩阵的行和,就像密集数组一样。稀疏代码实际上使用矩阵向量相乘来实现这一点,从而生成一个密集的矩阵。在
^{pr2}$它足够稀疏,以至于有些行没有零。对于float,特别是在0-1范围内,我不会得到非零值抵消的行。在
或者使用逐行计算:
并选择总和为零的行(在本例中为空行):
注意这是一个稀疏矩阵列表。你也有这个,对吧?在
如果我试着用它来做矩阵,我会得到你的错误:
好吧,这个错误并没有告诉我很多信息(至少没有更多的代码阅读),但是很明显输入列表有问题。但请再次阅读
csr_matrix
文档!它说我们可以给它一个稀疏矩阵的列表吗?在但是有一个
sparse.vstack
函数将使用一个矩阵列表(以np.vstack
为模型):如果选择总和不为零的行,则会得到更有趣的结果:
但我之前演示过,我们不需要迭代就可以得到行和。将
where
应用于Out[128]
,我得到了(非零行的)行索引:===
我怀疑生成
In[137]
是为了查找输入的nonzero
(np.where
)元素,或者将输入转换为numpy数组:稀疏矩阵列表上的
np.array
生成这些矩阵的对象数据类型数组。在相关问题 更多 >
编程相关推荐