python - real - Numpy resolver ecuación lineal 3d sin bucle
matplotlib ejes (1)
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)
ie = [[[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 3 vectores x de Ax = B ie (x_1, x_2, x_3).
Lo que me viene a la mente es multiplicar B con np.ones (2,3) y usar función de punto con el inverso de cada elemento A. Pero necesita un ciclo para hacer esto. (Que consume mucho tiempo cuando el tamaño de la matriz sube mucho) (Ej. A [:] [:] = [1,2,3]) ¿Cómo puedo resolver muchas ecuaciones Ax = B sin ¿lazo?
- Hice que los elementos de A y B sean los mismos, pero como probablemente sabrá, es solo un ejemplo.
Para las matrices invertibles, podríamos usar np.linalg.inv
en la matriz 3D
A
y luego usar multiplicación de matriz de tensor con B
para que perdamos el último y el primer eje de esas dos matrices respectivamente, como ese -
np.tensordot( np.linalg.inv(A), B, axes=((-1),(0)))
Ejecución de 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 la matriz del tensor podría ser reemplazada por np.matmul
, como tal -
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