scipy稀疏矩阵和numpy数组之间的点积给出ValueError
Posted
技术标签:
【中文标题】scipy稀疏矩阵和numpy数组之间的点积给出ValueError【英文标题】:Dot product between scipy sparse matrix and numpy array give ValueError 【发布时间】:2019-09-10 13:45:30 【问题描述】:我正在尝试计算 scipy 解析矩阵和 numpy 数组之间的点积。
首先我使用的是一个 numpy 矩阵,你可以在下面的代码中看到:
def power_iteration(matrix, n):
b_k = np.random.rand(matrix.shape[1])
for _ in range(n):
b_k = np.dot(matrix, b_k)
return b_k
这里的矩阵是一个numpy矩阵,不会出错。
如果将 scipy 稀疏矩阵作为参数传递,则会出现以下错误:ValueError: shape (6762,6762) and (1,6762) not aligned: 6762 (dim 1) != 1 (dim 0)
我变了
b_k = np.random.rand(matrix.shape[1])
进入
b_k = np.random.rand(matrix.shape[1], 1)
这使得点积工作,但不返回正确的 b_k 形状。我需要的形状是:(6762,)
编辑:到目前为止,我尝试过像这样重塑:
b_k = np.reshape(b_k, (matrix.shape[1],))
但这会将形状 (6762, 1) 转换为 (1, 6762),而不是 (6762,)
有什么建议吗?谢谢!
【问题讨论】:
在小数组和矩阵上练习这个,一次一个循环。注意b_k
是一维的ndarray
,还是二维的稀疏矩阵?稀疏矩阵总是 2d。带有这样一个矩阵的点会产生什么?
@hpaulj 在这种情况下,b_k 是一个形状为 (6762, 1) 的二维矩阵。在每个点积 b_k 之后仍然有 (6762, 1) 的形状,这是合乎逻辑的。我正在尝试使用 reshape 将 (6762,1) 形状转换为 (6762,) 。我基于这个答案:***.com/questions/17869840/… 但它似乎不起作用
一个点积后b_k
的type
和dtype
是什么?是matrix
是稀疏的,那么matrix.dot(b_k)
和np.dot(matrix.b_k)
会产生不同的对象。混合稀疏和密集数组必须小心。而如果中间的b_k
为np.matrix
或sparse
矩阵,则不能reshape为1d。
我发现了一个问题,矩阵的类型已经是 似乎为了在稀疏矩阵上使用np.dot
,您需要先使用matrix.toarray()
将其转换为密集矩阵。
另见https://docs.scipy.org/doc/scipy/reference/sparse.html#matrix-vector-product
【讨论】:
以上是关于scipy稀疏矩阵和numpy数组之间的点积给出ValueError的主要内容,如果未能解决你的问题,请参考以下文章
用于 numpy 数组和 scipy 稀疏矩阵的 Tensordot
如何将 numpy.matrix 或数组转换为 scipy 稀疏矩阵
如何点积 (1,10^13) (10^13,1) scipy 稀疏矩阵
为啥 scipy sparse 和 numpy 数组的乘法函数会给出不同的结果?
python使用scipy中的sparse.csr_matrix函数将numpy数组转化为稀疏矩阵(Create A Sparse Matrix)