首页 > 解决方案 > Numpy Linalg 解决广播

问题描述

我有一个 N x 2 x 2 numpy 矩阵 A。对于 {0...,N-1} 中的所有 i,我想计算:

解决(Ai, b)

其中 B 为 2 x 2 且 Ai=A[i,:,:]。我尝试在 numpy 中使用 np.linalg.solve 在以下代码中使用我认为正确的广播操作来执行此操作(下面的 A 和 b 仅用于演示目的,实际矩阵 A 大得多):

import numpy as np
A = np.array([[[1,2],[3,4]],[[2,3],[5,6]],[[3,4],[5,6]]])
b = np.eye(2)
np.linalg.solve(A, b)

但我收到以下错误:

ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (3,2,2)->(3,newaxis) (2,2)->(2,newaxis) and requested shape (2)

我有点困惑...我以前使用过 numpy 广播,过去从未遇到过这种性质的操作问题...有人知道我在这里做错了什么吗?

标签: pythonnumpymatrixarray-broadcasting

解决方案


您正在尝试求解 N 个不同的方程组,实际上您正在传递一个 N×2×2 矩阵 A,但只传递一个 2×2 矩阵 b。这就是说操作数不能一起广播时所指的错误。

如果要求解Ai x = b从 0 到 N-1 的所有 i,其中 Ai 为 2×2,则还需要b形状为 N×2×K(在你的情况下为 N×2×2)。

假设您总是想要,类似的东西会起作用b = eye(2)

>>> A = np.array([[[1,2],[3,4]],[[2,3],[5,6]],[[3,4],[5,6]]])
>>> b = np.array([np.eye(2),np.eye(2),np.eye(2)])
>>> np.linalg.solve(A, b)

这是输出:

array([[[-2.        ,  1.        ],
        [ 1.5       , -0.5       ]],

       [[-2.        ,  1.        ],
        [ 1.66666667, -0.66666667]],

       [[-3.        ,  2.        ],
        [ 2.5       , -1.5       ]]])

推荐阅读