Multiplicación de matrices de elementos en NumPy

Estoy haciendo mi primera incursión real en Python y NumPy para hacer un procesamiento de imágenes. Tengo una imagen cargada como una matriz numérica tridimensional, donde el eje 0 representa bandas de imagen, mientras que los ejes 1 y 2 representan columnas y filas de píxeles. A partir de esto, necesito tomar la matriz 3×1 que representa cada píxel y realizar algunas operaciones que resulten en otra matriz 3×1, que se usará para construir una imagen de resultados.

Mi primer enfoque (simplificado y con datos aleatorios) se ve así:

import numpy as np import random factor = np.random.rand(3,3) input = np.random.rand(3,100,100) results = np.zeros((3,100,100)) for x in range(100): for y in range(100): results[:,x,y] = np.dot(factor,input[:,x,y]) 

Pero esto me parece poco elegante e ineficiente. ¿Hay una manera de hacer esto en una fasion de elementos, por ejemplo:

 results = np.dot(factor,input,ElementWiseOnAxis0) 

Al tratar de encontrar una solución a este problema, me encontré con esta pregunta, que obviamente es bastante similar. Sin embargo, el autor no pudo resolver el problema a su entera satisfacción. Espero que algo haya cambiado desde 2012, o que mi problema sea lo suficientemente diferente como para que sea más fácil de resolver.

Las matrices con nudos usan la multiplicación de elementos por defecto. Echa un vistazo a numpy.einsum, y numpy.tensordot. Creo que lo que estás buscando es algo como esto:

 results = np.einsum('ij,jkl->ikl',factor,input)