2014-09-18 26 views
7

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.

risposta

10

Gli array di Numpy utilizzano la moltiplicazione elementare per impostazione predefinita. Controlla numpy.einsum e numpy.tensordot. Penso che quello che stai cercando sia qualcosa del genere:

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

Questo funziona perfettamente per questi dati e dovrebbe essere adattabile anche a problemi simili, grazie! – Joe

+1

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

Problemi correlati