【发布时间】: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,) 。我基于这个答案:stackoverflow.com/questions/17869840/… 但它似乎不起作用
-
一个点积后
b_k的type和dtype是什么?是matrix是稀疏的,那么matrix.dot(b_k)和np.dot(matrix.b_k)会产生不同的对象。混合稀疏和密集数组必须小心。而如果中间的b_k为np.matrix或sparse矩阵,则不能reshape为1d。 -
我发现了一个问题,矩阵的类型已经是
。我已将此作为参数传递给幂迭代函数:(d*matrix_s + (1 - d)*matrix_t),这里 d 是标量,matrix_t 也是 numpy.matrix。这意味着在第一个点积之前,b_k 是一个 numpy 数组,在第一个点积之后是一个 numpy 矩阵。
标签: numpy vector scipy sparse-matrix valueerror