我想将稀疏矩阵A乘以具有0,-1或1作为元素的矩阵B.为了降低矩阵乘法的复杂性,我可以忽略它们为0的项目,或者如果项目为1或者sub则继续添加没有乘法的列。如果它是-1。关于这一点的讨论在这里:
Random projection algorithm pseudo code
现在我可以继续实施这个技巧但是我想知道我是否使用Numpy的乘法函数它会更快。
有谁知道他们是否优化了这种矩阵的矩阵乘法?或者你可以建议一些东西来加快这个过程,因为我有一个矩阵300000x1000。
答案 0 :(得分:11)
你看过scipy.sparse
了吗?这里重新发明轮子是没有意义的。稀疏的matricies是一个相当标准的东西。
(在这个例子中,我使用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.]]