当前位置: 首页 > 知识库问答 >
问题:

Numpy:智能矩阵乘法到稀疏结果矩阵

虞滨海
2023-03-14

在使用numpy的python中,假设我有两个矩阵:

  1. 稀疏矩阵
  2. 密集的x*y矩阵

现在我想做np.dot(M, M. T),它将返回一个密集的x*x矩阵S_

但是,我只关心S中非零的单元格,这意味着如果我这样做了,对我的应用程序不会有任何影响

<代码>S\u=S*S\u

显然,这将是对操作的浪费,因为我想把在S中给出的不相关的单元格全部省略掉。记住在矩阵乘法中

<代码>S\uI,j)=np。总和(M[i,:]*M[:,j])

所以我只想对I,j进行这个操作,这样S[I,j]=真。

在C中运行的numpy实现是否以某种方式支持这一点,这样我就不需要用python循环来实现它了?

编辑1[已解决]:我仍然有这个问题,实际上M现在也是稀疏的。

现在,给定S的行和列,我实现它如下:

data = np.array([ M[rows[i],:].dot(M[cols[i],:]).data[0] for i in xrange(len(rows)) ])
S_   = csr( (data, (rows,cols)) )

。。。但它仍然很慢。有什么新想法吗?

编辑2:jdehesa提供了一个很好的解决方案,但我想节省更多内存。

解决方案是执行以下操作:

data = M[rows,:].multiply(M[cols,:]).sum(axis=1)

然后从行、列和数据构建一个新的稀疏矩阵。

然而,在运行上述行时,scipy构建了一个(连续的)numpy数组,其元素数量与第一个子矩阵的nnz加上第二个子矩阵的nnz一样多,在我的情况下,这可能导致内存错误。

为了节省更多内存,我想迭代地将每一行与其各自的“partner”列相乘,然后求和并丢弃结果向量。使用简单的python来实现这一点,基本上我回到了非常慢的版本。

有没有快速解决这个问题的方法?


共有1个答案

谢选
2023-03-14

以下是如何使用NumPy/SciPy对密集和稀疏M矩阵执行此操作:

import numpy as np
import scipy.sparse as sp

# Coordinates where S is True
S = np.array([[0, 1],
              [3, 6],
              [3, 4],
              [9, 1],
              [4, 7]])

# Dense M matrix
# Random big matrix
M = np.random.random(size=(1000, 2000))
# Take relevant rows and compute values
values = np.sum(M[S[:, 0]] * M[S[:, 1]], axis=1)
# Make result matrix from values
result = np.zeros((len(M), len(M)), dtype=values.dtype)
result[S[:, 0], S[:, 1]] = values

# Sparse M matrix
# Construct sparse M as COO matrix or any other way
M = sp.coo_matrix(([10, 20, 30, 40, 50],  # Data
                   ([0, 1, 3, 4, 6],      # Rows
                    [4, 4, 5, 5, 8])),    # Columns
                  shape=(1000, 2000))
# Convert to CSR for fast row slicing
M_csr = M.tocsr()
# Take relevant rows and compute values
values = M_csr[S[:, 0]].multiply(M_csr[S[:, 1]]).sum(axis=1)
values = np.squeeze(np.asarray(values))
# Construct COO sparse matrix from values
result = sp.coo_matrix((values, (S[:, 0], S[:, 1])), shape=(M.shape[0], M.shape[0]))
 类似资料:
  • 在课堂上,我必须为稀疏矩阵编写自己的线性方程求解器。我可以自由地使用任何类型的数据结构为稀疏矩阵,我必须实现几个解决方案,包括共轭梯度。 谢了!

  • 我正在处理一个非常大的稀疏矩阵乘法(matmul)问题。作为一个例子,让我们说: > A是一个二进制(75 x 200,000)矩阵。它很稀疏,所以我使用csc进行存储。我需要执行以下matmul操作: B=A.转置()*A 输出将是大小为200Kx200K的稀疏对称矩阵。 不幸的是,B存储在我笔记本电脑上的RAM(或“核心”)中会变得太大。另一方面,我很幸运,因为B有一些属性可以解决这个问题。

  • 我有许多scipy稀疏矩阵(目前为CSR格式),需要与密集的numpy 1D向量相乘。该向量称为G: 每个稀疏矩阵都具有形状(163842097152),并且非常稀疏。密度约为4.0e-6。我有一个包含100个稀疏矩阵的列表,称为spmats。 我可以轻松地将每个矩阵与G相乘,如下所示: 这将产生一个形状密集向量列表(16384,)。 我的应用程序对性能相当关键,所以我尝试了另一种方法,即首先将所

  • 稀疏矩阵(Sparse Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 稀疏矩阵的概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目时,则称该矩阵为稀疏矩阵。与之相反,若非0元素数目占大多数时,则称该矩阵

  • 主要内容:逐元素矩阵乘法,矩阵乘积运算,矩阵点积矩阵乘法是将两个矩阵作为输入值,并将 A 矩阵的行与 B 矩阵的列对应位置相乘再相加,从而生成一个新矩阵,如下图所示: 注意:必须确保第一个矩阵中的行数等于第二个矩阵中的列数,否则不能进行矩阵乘法运算。 图1:矩阵乘法 矩阵乘法运算被称为向量化操作,向量化的主要目的是减少使用的 for 循环次数或者根本不使用。这样做的目的是为了加速程序的计算。 下面介绍 NumPy 提供的三种矩阵乘法,从而进一步

  • 我正在计算两大组向量(具有相同特征)之间的余弦相似度。每组向量表示为一个scipy CSR稀疏矩阵a和B。我想计算一个x B^T,它不会稀疏。但是,我只需要跟踪超过某个阈值的值,例如0.8。我正试图用vanilla RDD在Pyspark中实现这一点,目的是使用为scipy CSR矩阵实现的快速向量操作。 A和B的行是标准化的,所以为了计算余弦相似度,我只需要找到A中每一行与B中每一行的点积。A的