gpt4 book ai didi

python - 添加 ndarray 和在 python 中转换为密集的稀疏矩阵时出现广播错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:56 25 4
gpt4 key购买 nike

我正在从 scipy 稀疏矩阵转换为密集矩阵,并使用 += 运算符将其添加到 ndarray 中,但出现广播错误。 ndarray 的形状为 (M,),而密集矩阵的形状为 (M,1)。当我尝试将 numpy.matrix 转换为 ndarray 时,形状变为 (1,M)。我也尝试在转换后使用 reshape(M,),形状变为 (M,M)。谁能解释一下我哪里搞砸了。

M = 100
N = 1000
K = 4
a= np.zeros((M,K))

b = sp.csr_matrix(np.ones((N,1)))
d = sp.csr_matrix(np.ones((M,N)))

c = np.ones(())
for k in range(K):
a[:,k] += d.dot(b).todense()

P.S:我是 python 和 stackoverflow 的新手。如果这是一个错误的问题或者这个问题之前已经被问过(我找不到),我们深表歉意

最佳答案

给 future 的 google 员工的旁注,OP 的代码导入了以下包:

> import numpy as np
> import scipy.sparse as sp

不管怎样,让我们​​从我们的解释开始吧。


您可以使用以下方法检查您的矩阵大小:

> np.shape(your_matrix_here) #equals to MATLAB: > size(your_matrix_here)

当你调用 todense() 时,你得到了:

matrix([[ 1000.],  #shape: (1, 100)
[ 1000.],
[ 1000.],
...

而 a[:,1] 看起来像这样:

array([ 0.,  0., ... ,  0.,  0.]) #shape: (100,)

因此您可能想使用 transpose() 转置矩阵。


但是转置矩阵返回包含矩阵的矩阵:

matrix([[ 1000.,  1000., ... , 1000.,  1000.]]) #shape: (1, 100)

并且由于某些原因 d.dot(b).todense().transpose()[0] 没有返回矩阵的第一个元素:

matrix([[ 1000.,  1000., ... , 1000.,  1000.]]) #still the same!

这可以通过以下方式解决:

> np.array(d.dot(b).todense().transpose())[0]

因此返回:

array([ 1000.,  1000., ... 1000.,  1000.])

现在他们两个得到了相同的形状,允许他们进行矩阵运算:

> np.shape(np.array(d.dot(b).todense().transpose())[0]) #(100,)

> np.shape(a[:,1]) #(100,)

总之,您要更改此行:

a[:,k] += d.dot(b).todense()

到:

a[:,k] += np.array(d.dot(b).todense().transpose())[0]

关于python - 添加 ndarray 和在 python 中转换为密集的稀疏矩阵时出现广播错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com