在使用numpy的python中,假设我有两个矩阵:
现在我想做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来实现这一点,基本上我回到了非常慢的版本。
有没有快速解决这个问题的方法?
以下是如何使用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的