Numpy resolviendo ecuación lineal 3d sin bucle

Quiero resolver la ecuación lineal Ax = b, cada A contiene en matriz 3d. Por ejemplo,

En Ax = B, supongamos que A.shape es (2,3,3)

es decir, [[[1,2,3], [1,2,3], [1,2,3]] [[1,2,3], [1,2,3], [1,2, 3]]]

y B.shape es (3,1) es decir [1,2,3] ^ T

Y quiero saber cada x de 3 vectores de Ax = B, es decir (x_1, x_2, x_3).

Lo que viene a la mente es multiplicar B por np.ones (2,3) y usar el punto de función con el inverso de cada elemento A. Pero se necesita un bucle para hacer esto. (Que consume mucho tiempo cuando el tamaño de la matriz aumenta) (Ej. A [:] [:] = [1,2,3]) ¿Cómo puedo resolver muchas ecuaciones de Ax = B sin ¿lazo?

  • Hice que los elementos de A y B sean iguales, pero como probablemente sepan, es solo un ejemplo.

Para matrices invertibles, podríamos usar np.linalg.inv en la matriz 3D A y luego usar la multiplicación de la matriz tensorial con B para que perdamos el último y el primer eje de esas dos matrices, respectivamente, como –

 np.tensordot( np.linalg.inv(A), B, axes=((-1),(0))) 

Ejecución de la muestra

 In [150]: A Out[150]: array([[[ 0.70454189, 0.17544101, 0.24642533], [ 0.66660371, 0.54608536, 0.37250876], [ 0.18187631, 0.91397945, 0.55685133]], [[ 0.81022308, 0.07672197, 0.7427768 ], [ 0.08990586, 0.93887203, 0.01665071], [ 0.55230314, 0.54835133, 0.30756205]]]) In [151]: B = np.array([[1],[2],[3]]) In [152]: np.linalg.solve(A[0], B) Out[152]: array([[ 0.23594665], [ 2.07332454], [ 1.90735086]]) In [153]: np.linalg.solve(A[1], B) Out[153]: array([[ 8.43831557], [ 1.46421396], [-8.00947932]]) In [154]: np.tensordot( np.linalg.inv(A), B, axes=((-1),(0))) Out[154]: array([[[ 0.23594665], [ 2.07332454], [ 1.90735086]], [[ 8.43831557], [ 1.46421396], [-8.00947932]]]) 

Alternativamente, la multiplicación de matrices tensoriales podría ser reemplazada por np.matmul , como así:

 np.matmul(np.linalg.inv(A), B) 

En Python 3.x, podríamos usar el operador @ para la misma funcionalidad –

 np.linalg.inv(A) @ B