首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中稀疏矩阵的矩阵乘法

Python中稀疏矩阵的矩阵乘法
EN

Stack Overflow用户
提问于 2011-09-20 05:51:43
回答 1查看 14.8K关注 0票数 4

我想将一个稀疏矩阵A与一个元素为0、-1或1的矩阵B相乘。为了降低矩阵乘法的复杂度,我可以忽略那些为0的项,或者如果该项为1或subs,则继续添加没有乘法的列。如果它是-1。关于这一点的讨论如下:

Random projection algorithm pseudo code

现在我可以继续实现这个技巧,但是我想知道如果我使用Numpy的乘法函数,它会更快。

有没有人知道他们是否针对这样的矩阵优化了矩阵乘法?或者你可以建议一些方法来加速这个过程,因为我有一个300000x1000的矩阵。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-20 07:14:56

你看过scipy.sparse吗?在这里,重新发明轮子是没有意义的。稀疏矩阵是一个相当标准的东西。

(在本例中,为了便于在乘法后打印,我使用了300000x4矩阵。不过,300000x1000矩阵应该不会有任何问题。假设您拥有大多数0元素,这将比将两个密集数组相乘要快得多。)

代码语言:javascript
运行
复制
import scipy.sparse
import numpy as np

# Make the result reproducible...
np.random.seed(1977)

def generate_random_sparse_array(nrows, ncols, numdense):
    """Generate a random sparse array with -1 or 1 in the non-zero portions"""
    i = np.random.randint(0, nrows-1, numdense)
    j = np.random.randint(0, ncols-1, numdense)
    data = np.random.random(numdense)
    data[data <= 0.5] = -1
    data[data > 0.5] = 1
    ij = np.vstack((i,j))
    return scipy.sparse.coo_matrix((data, ij), shape=(nrows, ncols))

A = generate_random_sparse_array(4, 300000, 1000)
B = generate_random_sparse_array(300000, 5, 1000)

C = A * B

print C.todense()

这会产生以下结果:

代码语言:javascript
运行
复制
[[ 0.  1.  0.  0.  0.]
 [ 0.  2. -1.  0.  0.]
 [ 1. -1.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]]
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7477733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档