所以我想做一个基本的矩阵乘法 A 乘 x,所以 Ax = b 但 A 是一个包含稀疏矩阵的“字典”(仅给出非零的条目),x 是一个 1d numpy 数组。例如
A = {0: {2: 2, 3: 3}, 1: {3: 5}, 3: {1: 10}}
视觉上看起来像
<img src="http://latex.codecogs.com/gif.latex?$$\begin{bmatrix}&space;0&space;&&space;0&&space;2&space;&&space;3\\&space;0&space;&&space;0&space;&&space;0&space;&&space;5\\&space;0&&space;0&space;&&space;0&space;&&space;0\\&space;0&&space;10&&space;0&&space;0&space;\end{bmatrix}$$" title="$$\begin{bmatrix} 0 & 0& 2 & 3\\ 0 & 0 & 0 & 5\\ 0& 0 & 0 & 0\\ 0& 10& 0& 0 \end{bmatrix}$$" />
x 是一个 1d numpy 数组,所以
x = np.array([1, 1, 1, 1]) #x1 x2 x3 x4
x
for i in x:
print(i)
最后我希望结果 Ax 也是一个 1d numpy 数组(A 是 4 x 4,x 是 4 x 1,所以 A*x 也必须是 4 x 1)。所以输出应该是
Ax = np.array([5, 5, 0, 10])
有没有办法在仅给出稀疏矩阵的情况下以正确的顺序进行 A 的矩阵乘法?
最佳答案
第一个解决方案使用 scipy 坐标格式的稀疏矩阵(请参阅 coo_matrix ):
from scipy.sparse import coo_matrix
rows, cols, data = zip(*[(row, col, A[row][col]) for row in A for col in A[row]])
coo = coo_matrix((data, (rows, cols)))
>>> coo.toarray()
array([[ 0, 0, 2, 3],
[ 0, 0, 0, 5],
[ 0, 0, 0, 0],
[ 0, 10, 0, 0]])
coo.dot(x)
>>> array([ 5, 5, 0, 10])
第二个解决方案仅使用 python 和 numpy 来处理 NaN 并保存最终数组:
rows = range(min(A.keys()), 1 + max(A.keys()))
result = []
for row in rows:
row_data = A.get(row)
result.append(sum(A_val * x[col]
for col, A_val in row_data.iteritems()) # .items() for Python 3
if row_data else np.nan)
Ax = np.array(result)
>>> Ax
array([ 5., 5., nan, 10.])
关于python - 嵌套字典存储和一维 numpy 数组的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52123476/