Python中稀疏矩阵的矩阵乘法

我想将一个稀疏矩阵A与一个以0,-1或1为元素的矩阵B相乘。为了降低矩阵乘法的复杂性,如果项为0,则可以忽略这些项;或者,如果项为1或子项,则可以添加不进行乘法的列。如果是-1。关于此的讨论在这里:

随机投影算法伪代码

现在,我可以继续实施此技巧,但是我想知道是否使用Numpy的乘法功能会更快。

有谁知道他们是否针对此类矩阵优化了矩阵乘法?或者您可以提出一些建议来加快此过程,因为我有300000x1000的矩阵。

回答:

你看了scipy.sparse吗?在这里没有必要重新发明轮子。稀疏矩阵是相当标准的事情。

(在示例中,我正在使用300000x4矩阵以使乘法后的打印更容易。不过,300000x1000矩阵应该没问题。假设您拥有大多数0元素,这比将两个密集数组相乘要快得多。)

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()

这样产生:

[[ 0.  1.  0.  0.  0.]

[ 0. 2. -1. 0. 0.]

[ 1. -1. 0. 0. 0.]

[ 0. 0. 0. 0. 0.]]

以上是 Python中稀疏矩阵的矩阵乘法 的全部内容, 来源链接: utcz.com/qa/418760.html

回到顶部