Numpy Linalg解决广播问题

时间:2019-02-01 15:51:39

标签: python numpy matrix numpy-broadcasting

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

solve(Ai,b)

其中B是2 x 2且Ai = A [i,:,:]。我尝试使用np.linalg.solve在numpy中执行此操作,使用以下代码中我认为是正确的广播操作(下面的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广播,过去从未进行过这种操作的问题...有人知道我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

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

如果您要求解从{0}到N-1的所有i的Ai x = b,其中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       ]]])