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_ktypedtype是什么?是matrix是稀疏的,那么matrix.dot(b_k)np.dot(matrix.b_k)会产生不同的对象。混合稀疏和密集数组必须小心。而如果中间的b_knp.matrixsparse矩阵,则不能reshape为1d。 我发现了一个问题,矩阵的类型已经是 。我已将此作为参数传递给幂迭代函数:(d*matrix_s + (1 - d)*matrix_t),这里 d 是标量,matrix_t 也是 numpy.matrix。这意味着在第一个点积之前,b_k 是一个 numpy 数组,在第一个点积之后是一个 numpy 矩阵。 【参考方案1】:

似乎为了在稀疏矩阵上使用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)

Numpy/Scipy 稀疏与密集乘法