gpt4 book ai didi

python - 乘以稀疏矩阵的列元素

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:12 24 4
gpt4 key购买 nike

我有一个包含许多零元素的稀疏 csc 矩阵,我想为它计算每一行的所有列元素的乘积。

即:

 A = [[1,2,0,0],
[2,0,3,0]]

应转换为:

V = [[2,
6]]

使用 numpy 密集矩阵,这可以通过将所有零值替换为一个值并使用 A.prod(1) 来实现。然而,这不是一种选择,因为密集矩阵太大。

有什么方法可以在不将稀疏矩阵转换为密集矩阵的情况下实现这一点?

最佳答案

方法#1:我们可以使用稀疏元素的行索引作为 ID,并将这些元素的对应值与 np.multiply.reduceat 相乘。以获得所需的输出。

因此,一个实现将是 -

from scipy import sparse
from scipy.sparse import csc_matrix

r,c,v = sparse.find(a) # a is input sparse matrix
out = np.zeros(a.shape[0],dtype=a.dtype)
unqr, shift_idx = np.unique(r,return_index=1)
out[unqr] = np.multiply.reduceat(v, shift_idx)

sample 运行-

In [89]: # Let's create a sample csc_matrix
...: A = np.array([[-1,2,0,0],[0,0,0,0],[2,0,3,0],[4,5,6,0],[1,9,0,2]])
...: a = csc_matrix(A)
...:

In [90]: a
Out[90]:
<5x4 sparse matrix of type '<type 'numpy.int64'>'
with 10 stored elements in Compressed Sparse Column format>

In [91]: a.toarray()
Out[91]:
array([[-1, 2, 0, 0],
[ 0, 0, 0, 0],
[ 2, 0, 3, 0],
[ 4, 5, 6, 0],
[ 1, 9, 0, 2]])

In [92]: out
Out[92]: array([ -2, 0, 6, 120, 0, 18])

方法 #2:我们正在执行基于 bin 的乘法。我们有基于 bin 的求和解决方案 np.bincount .因此,这里可以使用的一个技巧是将数字转换为对数,执行基于 bin 的求和,然后使用 exponential(log 的反转)转换回原始格式,就是这样!对于负数,我们可能会添加一个或更多步骤,但让我们看看非负数的实现是什么样的 -

r,c,v = sparse.find(a)
out = np.exp(np.bincount(r,np.log(v),minlength = a.shape[0]))
out[np.setdiff1d(np.arange(a.shape[0]),r)] = 0

使用非负数运行的示例 -

In [118]: a.toarray()
Out[118]:
array([[1, 2, 0, 0],
[0, 0, 0, 0],
[2, 0, 3, 0],
[4, 5, 6, 0],
[1, 9, 0, 2]])

In [120]: out # Using listed code
Out[120]: array([ 2., 0., 6., 120., 18.])

关于python - 乘以稀疏矩阵的列元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40918414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com