我的代码中有以下表达式:

a = (b / x[:, np.newaxis]).sum(axis=1)

其中b是形状的ndarray (M, N)x是形状的ndarray (M,) 现在, b实际上是稀疏的,所以为了提高内存效率,我想在scipy.sparse.csc_matrixcsr_matrix 但是,没有实现这种方式的广播(即使保证分割或乘法保持稀疏性)( x的条目非零),并引发NotImplementedError 是否有sparse功能我不知道会做我想要的? dot()将沿错误的轴相加。)

===============>>#1 票数:7 已采纳

如果b是CSC格式,则b.data具有b的非零条目,并且b.indices具有每个非零条目的行索引,因此您可以将您的除法视为:

b.data /= np.take(x, b.indices)

它比Warren的优雅解决方案更为讨厌,但在大多数情况下它可能也会更快:

b = sps.rand(1000, 1000, density=0.01, format='csc')
x = np.random.rand(1000)

def row_divide_col_reduce(b, x):
    data = b.data.copy() / np.take(x, b.indices)
    ret = sps.csc_matrix((data, b.indices.copy(), b.indptr.copy()),
                         shape=b.shape)
    return ret.sum(axis=1)

def row_divide_col_reduce_bis(b, x):
    d = sps.spdiags(1.0/x, 0, len(x), len(x))
    return (d * b).sum(axis=1)

In [2]: %timeit row_divide_col_reduce(b, x)
1000 loops, best of 3: 210 us per loop

In [3]: %timeit row_divide_col_reduce_bis(b, x)
1000 loops, best of 3: 697 us per loop

In [4]: np.allclose(row_divide_col_reduce(b, x),
   ...:             row_divide_col_reduce_bis(b, x))
Out[4]: True

如果你就地进行划分,你可以在上面的例子中将时间减少一半,即:

def row_divide_col_reduce(b, x):
    b.data /= np.take(x, b.indices)
    return b.sum(axis=1)

In [2]: %timeit row_divide_col_reduce(b, x)
10000 loops, best of 3: 131 us per loop

===============>>#2 票数:6

要实现a = (b / x[:, np.newaxis]).sum(axis=1) ,可以使用a = b.sum(axis=1).A1 / x A1属性返回1D ndarray,因此结果是1D ndarray,而不是matrix 这个简洁的表达式有效,因为您既可以按x缩放, 也可以沿轴1求和。例如:

In [190]: b
Out[190]: 
<3x3 sparse matrix of type '<type 'numpy.float64'>'
        with 5 stored elements in Compressed Sparse Row format>

In [191]: b.A
Out[191]: 
array([[ 1.,  0.,  2.],
       [ 0.,  3.,  0.],
       [ 4.,  0.,  5.]])

In [192]: x
Out[192]: array([ 2.,  3.,  4.])

In [193]: b.sum(axis=1).A1 / x
Out[193]: array([ 1.5 ,  1.  ,  2.25])

更一般地说,如果要使用向量x缩放稀疏矩阵的行,可以将左侧的b乘以对角线上包含1.0/x的稀疏矩阵。 函数scipy.sparse.spdiags可用于创建这样的矩阵。 例如:

In [71]: from scipy.sparse import csc_matrix, spdiags

In [72]: b = csc_matrix([[1,0,2],[0,3,0],[4,0,5]], dtype=np.float64)

In [73]: b.A
Out[73]: 
array([[ 1.,  0.,  2.],
       [ 0.,  3.,  0.],
       [ 4.,  0.,  5.]])

In [74]: x = array([2., 3., 4.])

In [75]: d = spdiags(1.0/x, 0, len(x), len(x))

In [76]: d.A
Out[76]: 
array([[ 0.5       ,  0.        ,  0.        ],
       [ 0.        ,  0.33333333,  0.        ],
       [ 0.        ,  0.        ,  0.25      ]])

In [77]: p = d * b

In [78]: p.A
Out[78]: 
array([[ 0.5 ,  0.  ,  1.  ],
       [ 0.  ,  1.  ,  0.  ],
       [ 1.  ,  0.  ,  1.25]])

In [79]: a = p.sum(axis=1)

In [80]: a
Out[80]: 
matrix([[ 1.5 ],
        [ 1.  ],
        [ 2.25]])

  ask by Juan translate from so

未解决问题?本站智能推荐:

3回复

为什么scipy.sparse.csc_matrix.sum()的结果会将其类型更改为numpy矩阵?

我想生成一个大的稀疏矩阵并求它,但我遇到了很多MemoryError 。 所以我尝试通过scipy.sparse.csc_matrix.sum进行操作,但发现数据类型在获取总和后变回了numpy matrix 。 因此,我将mat生成为零作为矩阵,以便在mat_head全为零时测试结果
1回复

Scipy.sparse CSC矩阵性能

我目前正在尝试使用隐式欧拉求解某些方程。 由于我对Fortran感到无聊,所以我认为最好是使用Python尝试一下,看看从现有的性能来看,与现有的Fortran程序之间的距离有多近。 对于我的问题,我想利用稀疏矩阵。 我遇到了程序的当前瓶颈是初始化稀疏矩阵并从对角线中减去一些东西。
1回复

索引和替换稀疏CSC矩阵中的值(Python)

我有一个稀疏的CSC矩阵“ A”,在其中我要用全零的向量替换第一行,但第一项是1。 到目前为止,我正在做低效率的版本,例如: import numpy as np from scipy.sparse import csc_matrix row = np.array([0, 2, 2,
1回复

使用pytables,效率更高:scipy.sparse还是numpy密集矩阵?

当使用pytables ,对于scipy.sparse矩阵格式没有支持(据我所知),所以要存储矩阵我必须进行一些转换,例如 问题是get_sparse函数需要一些时间(从磁盘读取),如果我理解正确也需要数据适合内存。 唯一的其他选择似乎是将矩阵转换为密集格式( numpy arra
1回复

Scipy稀疏:SciPy / NumPy更新后出现奇异矩阵警告

我的问题来自对大型电阻器系统的节点分析。 我基本上是在建立一个大的稀疏矩阵A ,即我的解向量b ,并且试图解决线性方程A * x = b 。 为此,我使用了scipy.sparse.linalg.spsolve方法。 直到最近,一切都运转良好,直到我将SciPy从v0.13.3升级到v
2回复

将numpy数组添加到scipy.sparse.dok_matrix

我有一个scipy.sparse.dok_matrix (维度为mxn),想要添加一个长度为m的扁平numpy数组。 但是,当代码尝试删除非现有密钥( del self[(i,j)] )时,此代码在dok_matrix.__setitem__引发异常。 所以,现在我以不雅的方式这样
3回复

如何将numpy.matrix或数组转换为scipy稀疏矩阵

对于SciPy稀疏矩阵,可以使用todense()或toarray()转换为NumPy矩阵或数组。 反向的功能是什么? 我搜索过,但不知道哪些关键字应该是正确的。
1回复

numpy scipy python从csv导入稀疏矩阵

我有一个.csv文件,格式如下: id_A,id_B 2135,1 2303,1 6292,1 大约有18万条条目表示稀疏矩阵中的位置,在稀疏矩阵中具有1(另一个值为0)。 我想知道是否有一种方法可以用numpy或scipy在python中导入它。 谢谢 我尝试这样的
2回复

带广播的稀疏scipy矩阵向量的元素加法

我试图弄清楚如何最好地执行稀疏矩阵和稀疏向量的元素加法(和减法)。 我在SO上找到了这个技巧 : 但不幸的是它只更新了非零值: SO线程上实际接受的答案: 做同样的事情。 不幸的是,我现在已经没有想法了,所以我希望你能帮助我找出解决这个问题的最佳方法。 编辑:我
3回复

如何将“SciPy稀疏矩阵”转换为“NumPy矩阵”?

我正在使用一个名为“incidence_matrix(G)”的python函数,它返回图的事件矩阵。 它来自Networkx包。 我面临的问题是这个函数的返回类型是“Scipy Sparse Matrix”。 我需要使用numpy矩阵或数组格式的Incident矩阵。 我想知道是否有任何