Sto realizzando la mia prima vera incursione in Python e NumPy per l'elaborazione delle immagini. Ho un'immagine caricata come una matrice NumPy tridimensionale, dove l'asse 0 rappresenta le bande dell'immagine, mentre gli assi 1 e 2 rappresentano colonne e righe di pixel. Da questo, ho bisogno di prendere la matrice 3x1 che rappresenta ciascun pixel ed eseguire alcune operazioni che si traducono in un'altra matrice 3x1, che verrà utilizzata per costruire un'immagine dei risultati.Moltiplicazione matrice degli elementi in NumPy
Il mio primo approccio (semplificato e con dati casuali) aspetto:
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])
Ma questo mi sembra poco elegante e inefficiente. C'è un modo per fare questo in un fasion elemento-saggio, per es .:
results = np.dot(factor,input,ElementWiseOnAxis0)
Nel tentativo di trovare una soluzione a questo problema mi sono imbattuto this domanda, che è ovviamente molto simile. Tuttavia, l'autore non è stato in grado di risolvere il problema in modo soddisfacente. Spero che o qualcosa sia cambiato dal 2012, o il mio problema è sufficientemente diverso dal loro per renderlo più facilmente risolvibile.
Questo funziona perfettamente per questi dati e dovrebbe essere adattabile anche a problemi simili, grazie! – Joe
Nel mio caso la forma di input è: (100, 100, 3). Mi ci è voluto un po 'per capirlo, ma potrebbe essere utile agli altri. Nel mio caso era: risultati = np.einsum ('ij, klj-> kli', fattore, input) – Luigolas