python - Python 中稀疏矩阵的矩阵乘法

标签 python multidimensional-array matrix numpy

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

Random projection algorithm pseudo code

现在我可以继续实现这个技巧了,但我想知道我是否使用 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 - Python 中稀疏矩阵的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477733/

相关文章:

c# - 在 C# 中高效地复制对称矩阵

python - 我可以在所有情况下使用 idxmax() 代替 argmax() 吗?

python - 过滤混合类型和对象的列

python - celery :启动时启动任务

c++ - 静态多维数组 (C/C++)

C++ For 循环、多维数组和指针练习

python - 我的邮件不能再发送了?

java - 绘制填充多维数组

r - 使用 R 创建完全对立的绘图

python - NumPy:填充数组中 1 周围的字段