假设我有一个2d稀疏数组。在我的实际用例的行和列两者的数量要大得多(说20000和50000),因此它不适合在内存中,当使用密表示:如何通过广播密集1d数组元素乘法scipy.sparse矩阵?
>>> import numpy as np
>>> import scipy.sparse as ssp
>>> a = ssp.lil_matrix((5, 3))
>>> a[1, 2] = -1
>>> a[4, 1] = 2
>>> a.todense()
matrix([[ 0., 0., 0.],
[ 0., 0., -1.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 2., 0.]])
现在假设我有所有的密集维数组与(在我的现实生活中的情况下,或50000)大小3个非零组件:
>>> d = np.ones(3) * 3
>>> d
array([ 3., 3., 3.])
我想计算的的元素单元的乘法和使用numpy的通常的广播语义天。然而,在SciPy的稀疏矩阵是np.matrix的:在“*”操作符被重载把它像一个矩阵乘法,而不是按元素乘法:
>>> a * d
array([ 0., -3., 0., 0., 6.])
一个解决办法是做“一个”切换到阵列的语义为‘*’操作,这将产生预期的结果:
>>> a.toarray() * d
array([[ 0., 0., 0.],
[ 0., 0., -3.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 6., 0.]])
但我不能这样做,因为调用ToArray的()将兑现的密集版本的‘一个’,这不适合内存(并且结果也会很密集):
>>> ssp.issparse(a.toarray())
False
任何想法如何建立这个,而只保留稀疏的数据结构,而不必在'a'的列上做一个不够高效的python循环?
如果'D'是相同尺寸的稀疏矩阵为'A'可以使用'a.multiply(d)'。也许你可以做一个长度为N行的“d”,并且每次循环N行“a”? – mtrw 2010-07-14 19:43:44
但是d密集并且不能在存储器中明确地被广播以满足多重形状要求。循环一个批处理是一种选择,但我觉得这有点hackish。我原以为有没有python循环这样做的香草vectorized/scipy的方式来做到这一点。 – ogrisel 2010-07-14 22:15:41
我想问题是你想要一个(稀疏)矩阵的表示,但是一个数组的多重操作。我认为你不得不不幸地推出自己的产品。 – mtrw 2010-07-15 19:33:00