我有一个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广播,过去从未进行过这种操作的问题...有人知道我在这里做错了吗?
答案 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 ]]])