Lista de comprensión con matrices numpy – ¿mala práctica?

Me pregunto si el enfoque a continuación se consideraría una mala práctica y, de ser así, si alguien pudiera brindar alguna orientación hacia otro enfoque.

Aquí está el código en cuestión:

a = np.array([[1,2,3],[4,5,6]]) b = np.array([-5,5]) c = np.array([np.multiply(a[x],b[x]) for x in range(2)]) 

El objective aquí es obtener una matriz de la misma forma que ‘a’ donde los valores en el primer elemento de ‘a’ se multiplican por el primer elemento de ‘b’ y los valores en el segundo elemento de ‘a’ se multiplican por el segundo elemento de ‘b’

El código anterior funciona, pero dada la mezcla de listas / matrices involucradas, me preocupa que se desaconseje esto, pero no tengo una solución más elegante. ¡Muchas gracias de antemano!

NumPythonic sería extender las dimensiones de b a una matriz 2D con np.newaxis/None y luego dejar que la broadcasting entre en juego para una vectorized elementwise multiplication . La implementación se vería así:

 c = a * b[:,None] 

Una vez que se amplían las dimensiones, también puede usar np.multiply para el mismo efecto, como así:

 c = np.multiply(a,b[:,None]) 

Lo más importante es que aquí hay algunos números de rendimiento para persuadirlo de usar la broadcasting :

 In [176]: a = np.random.rand(2000,3000) In [177]: b = np.random.rand(2000) In [178]: %timeit np.array([np.multiply(a[x],b[x]) for x in range(a.shape[0])]) 10 loops, best of 3: 118 ms per loop In [179]: %timeit a * b[:,None] 10 loops, best of 3: 63.8 ms per loop In [180]: %timeit np.multiply(a,b[:,None]) 10 loops, best of 3: 64 ms per loop