es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python: Multiplicación elemento a elemento de arrays de 3d con arrays de 3d.

Estoy teniendo problemas para implementar la siguiente ecuación de manera eficiente utilizando Python:

beta y gamma son coordenadas cartesianas {x,y} y b,m son algunos valores de índice que pueden ser bastante grandes n=10000. Tengo una versión funcionando del código que se muestra a continuación para el caso simple de l=2 y m,b = 4 (l y m siempre tienen la misma longitud). Comprobé el código usando timeit y el cuello de botella es la multiplicación elemento a elemento con una matriz de tamaño (3,3) y el cambio de forma de la matriz resultante en forma (3m,3m). ¿Alguien tiene alguna idea de cómo aumentar el rendimiento? (También noté que mi versión actual sufre una sobrecarga bastante grande para valores grandes de l….)

“`import numpy as np

gl3 = np.array([[1, 4, 5],[2, 6, 7]])
gl33 = gl3.reshape(-1, 3, 1) * gl3.reshape(-1, 1, 3)

Alm = np.arange(1, 9, 1).reshape(2, 4)
Blb = np.arange(7, 15, 1).reshape(2, 4)

ABlmb = Alm.reshape(-1, 4, 1) * Blb.reshape(-1, 1, 4)

Dlmb33 = np.sum(gl33.reshape(-1, 1, 1, 3, 3) * ABlmb.reshape(-1, 4, 4, 1, 1), axis=0)
D = np.concatenate(np.concatenate(Dlmb33, axis=2), axis=0)“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible manera de aumentar el rendimiento del código proporcionado es utilizar la transmisión en lugar de la remodelación y multiplicación elemento por elemento. La transmisión permite realizar operaciones aritméticas entre matrices con formas diferentes sin crear nuevas copias de los datos. Esto conduce a una aceleración significativa en comparación con la remodelación y la multiplicación elemento por elemento.

    Utilizando la transmisión, el código puede escribirse de la siguiente manera:

    “ `python
    g_l3 = np.array ([[1, 4, 5], [2, 6, 7]])
    g_l33 = g_l3 […, np.newaxis, np.newaxis] * g_l3 [:, np.newaxis,:, np.newaxis]

    A_lm = np.arange(1, 9) .reshape (2, 4)
    B_lb = np.arange (7, 15) .reshape (2, 4)

    AB_lmb = A_lm […, np.newaxis] * B_lb [:, np.newaxis,:]

    D_lmb33 = np.sum (g_l33 […, np.newaxis,:, :] * AB_lmb [:,:, np.newaxis, np.newaxis,:], axis = (0,1))
    D = np.concatenate (np.concatenate (D_lmb33, axis = 1), axis = 0)
    “ `

    En este código, la transmisión se utiliza para realizar la multiplicación elemento por elemento entre ‘g_l3’ y sí mismo para obtener ‘g_l33’. De manera similar, la transmisión se utiliza para realizar la multiplicación elemento por elemento entre ‘A_lm’ y ‘B_lb’ para obtener ‘AB_lmb’. Se utiliza la notación ‘…’ para el corte de matriz para especificar el eje a lo largo del cual realizar la transmisión.

    Por último, se utiliza ‘numpy.sum’ para calcular la suma sobre los ejes apropiados de las matrices resultantes, y se utiliza ‘numpy.concatenate’ para concatenar las matrices resultantes.

    Utilizar la transmisión en lugar de la remodelación y la multiplicación elemento por elemento puede conducir a mejoras significativas en el rendimiento, especialmente para matrices grandes.

Comments are closed.