python - 嵌套字典存储和一维 numpy 数组的矩阵乘法

标签 python arrays numpy

所以我想做一个基本的矩阵乘法 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/

相关文章:

python - os.listdir 返回带有特殊字符的奇怪文件名字符串

c# - 在 Python 中与 Arduino : works in C#, 对话失败

javascript - 如何找到包含这些ID的数组元素?

java - 初始化 double 组java

python - 是否可以关闭内存映射的临时文件而不刷新其内容?

python - 为什么我的 RNN 不学习?

python - 如何在多维数组中插入列?

python - 从 pandas DataFrame 中删除名称包含特定字符串的第一(或任何第 n)列

python - 使用 any() 和 all() 检查列表是否包含一组值或另一个

java - 如何调整此代码以输入和打印数字列表?