Decodifica del prodotto puntato di NumPy una breve esplorazione della magia dimensionale

Decodifica del prodotto puntato di NumPy esplorazione magica dimensionale

Chiarire una volta per tutte la confusione sul prodotto scalare di NumPy

Immagine generata con DreamStudio con la prompt “Un mondo caotico, oscuro, cupo e multidimensionale pieno di maghi del codice”.

Introduzione

Sono l’unico che periodicamente si confonde quando si tratta di dimensioni in NumPy? Oggi, mentre stavo leggendo una pagina di documentazione di Gradio, mi sono imbattuto nel seguente frammento di codice:

sepia_filter = np.array([    [0.393, 0.769, 0.189],     [0.349, 0.686, 0.168],    [0.272, 0.534, 0.131],])# forma di input_img (H, W, 3)# forma di sepia_filter (3, 3)sepia_img = input_img.dot(sepia_filter.T)  # <- perché questo è lecito??sepia_img /= sepia_img.max()

Ehi, ehi, ehi! Perché il prodotto scalare di un’immagine (W, H, 3) con un filtro (3, 3) è lecito? Ho chiesto a ChatGPT di spiegarmelo, ma ha iniziato a darmi risposte sbagliate (come dire che questo non funziona) o a ignorare la mia domanda e a rispondere ad altro. Quindi, non c’è stata altra soluzione se non usare il mio cervello (più leggere la documentazione, sigh).

Se anche tu sei un po’ confuso dal codice sopra, continua a leggere.

Prodotto Scalare: Un Esempio Generico

Dalla documentazione del prodotto scalare di NumPy (con piccole modifiche):

Se a.shape = (I, J, C) e b.shape = (K, C, L), allora dot(a, b)[i, j, k, l] = sum(a[i, j, :] * b[k, :, l]). Notare che l’ultima dimensione di “a” è uguale alla penultima dimensione di “b”.

O, in codice:

I, J, K, L, C = 10, 20, 30, 40, 50a = np.random.random((I, J, C))b = np.random.random((K, C, L))c = a.dot(b)i, j, k, l = 3, 2, 4, 5print(c[i, j, k, l])print(sum(a[i, j, :] * b[k, :, l]))

Output (stesso risultato):

13.12501290128471313.125012901284713

Comprensione della Forma del Prodotto Scalare di NumPy

Per determinare la forma di un prodotto scalare in anticipo, segui questi passaggi:

Passaggio 1: Considera due array, “a” e “b,” con le rispettive forme.

# Esempi di forme per gli array a e ba_shape = (4, 3, 2)b_shape = (3, 2, 5)# Crea array casuali con le forme specificatea = np.random.random(a_shape)b =…