Matrise-multiplikasjon med np.matmul og @
Multipliser matriser korrekt med np.matmul og operatoren @, og skill elementvis multiplikasjon med * fra ekte matrise-multiplikasjon.
Matrise-multiplikasjon med np.matmul og @ er en gratis leksjon i Pandas & NumPy Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Pandas & NumPy Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Pandas & NumPy Academy inneholder totalt 4 leksjoner.
Hvorfor matrise-multiplikasjon er viktig
Matrise-multiplikasjon står sentralt i datavitenskap og maskinlæring. Den ligger til grunn for nevrale nettverk, dimensjonsreduksjon og lineære transformasjoner. I Python gir NumPy Dem to enkle måter å multiplisere matriser på: funksjonen np.matmul() og operatoren @, som ble introdusert i Python 3.5. Begge er raske, vektoriserte og langt mer effektive enn nøstede Python-løkker.
Reglene for matrise-multiplikasjon
For to matriser A og B er produktet A @ B bare gyldig når antallet kolonner i A er lik antallet rader i B. Hvis A har formen (m, n) og B har formen (n, k), får resultatet formen (m, k). Denne regelen kalles kravet til indre dimensjoner og gjelder uavhengig av hvilken NumPy-funksjon De bruker.
import numpy as np
A = np.array([[1, 2], [3, 4]]) # shape (2, 2)
B = np.array([[5, 6], [7, 8]]) # shape (2, 2)
C = A @ B
print(C) # [[19 22] [43 50]]np.matmul sammenlignet med @-operatoren
np.matmul(A, B) og A @ B gir identiske resultater for 2D-arrayer. Operatoren @ er ganske enkelt syntaktisk sukker — den kaller __matmul__ i bakgrunnen, og NumPy implementerer dette med den samme BLAS-rutinen på C-nivå. Bruk @ i vanlig kode for bedre lesbarhet, og bruk np.matmul når De vil sende funksjonen som en kallbar verdi eller håndtere spesialtilfeller uttrykkelig.
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(np.matmul(A, B)) # same as A @ B
print(A @ B) # same resultSkillet mellom @, * og np.dot
NumPy har tre multiplikasjonsfunksjoner som det er lett å forveksle. A * B er elementvis multiplikasjon (Hadamard-produkt). np.dot(A, B) oppfører seg som np.matmul for 2D-arrayer, men har annen betydning for høyere dimensjoner. A @ B er ren matrise-multiplikasjon og følger den matematiske definisjonen nøyaktig — foretrekk den fremfor np.dot når De arbeider med matriser.
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print('element-wise:', A * B) # [[5 12] [21 32]]
print('matmul:', A @ B) # [[19 22] [43 50]]Matrise-multiplikasjon er ikke kommutativ
I motsetning til multiplikasjon av skalarer er matrise-multiplikasjon ikke kommutativ: A @ B er vanligvis forskjellig fra B @ A. Dimensjonene er kanskje ikke engang kompatible i begge retninger. Dette er viktig når De skriver transformasjoner — rekkefølgen på operasjonene endrer resultatet. Hold alltid oversikt over hvilken matrise som står til venstre og hvilken som står til høyre.
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[0, 1], [1, 0]])
print('A @ B:', A @ B) # [[2 1] [4 3]]
print('B @ A:', B @ A) # [[3 4] [1 2]] -- different!Partivis matrise-multiplikasjon
Når arrayene har mer enn to dimensjoner, behandler np.matmul og @ de ekstra innledende dimensjonene som batch-dimensjoner og multipliserer matriser parallelt. En array med formen (32, 3, 4) som multipliseres med en med formen (32, 4, 5), gir for eksempel et resultat med formen (32, 3, 5) — 32 uavhengige multiplikasjoner av 3×4 @ 4×5 samtidig. Det er slik rammeverk for dyp læring behandler mini-batcher effektivt.
import numpy as np
batch_A = np.random.rand(32, 3, 4)
batch_B = np.random.rand(32, 4, 5)
result = batch_A @ batch_B
print(result.shape) # (32, 3, 5)Matrise-vektor-multiplikasjon
Et vanlig spesialtilfelle er å multiplisere en matrise med en vektor. Hvis A har formen (m, n) og v er en 1D-array med lengde n, produserer A @ v en 1D-array med lengde m. NumPy håndterer dimensjonstilpasningen automatisk — De trenger ikke å omforme v til en kolonnevektor. Dette mønsteret forekommer overalt: ved bruk av vekter i lineær regresjon, projisering av egenskaper og samtidig beregning av skalarprodukter for hver rad.
import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6]]) # (2, 3)
v = np.array([1, 0, -1]) # (3,)
print(A @ v) # [1-3, 4-6] = [-2, -2]Ytelse: @ sammenlignet med Python-løkker
NumPys matrise-multiplikasjon kaller optimaliserte BLAS/LAPACK-rutiner og kjører i kompilert C-kode. En ren nøstet Python-løkke som implementerer den samme operasjonen, er vanligvis 100–1000 ganger tregere for store matriser. Når De trenger gjentatte matriseprodukter i en datapipeline — for eksempel ved egenskapstransformasjoner, PCA-projeksjoner eller oppdatering av vekter — bør De alltid bruke @ eller np.matmul og aldri implementere den indre løkken selv.
import numpy as np, time
A = np.random.rand(500, 500)
B = np.random.rand(500, 500)
t0 = time.time()
C = A @ B
print(f'NumPy: {(time.time()-t0)*1000:.1f} ms') # single-digit msKjede flere matriseprodukter
De kan kjede flere @-operasjoner i ett uttrykk: A @ B @ C evalueres fra venstre mot høyre. NumPy optimaliserer ikke automatisk multiplikasjonsrekkefølgen (i motsetning til MATLABs mtimes), så rekkefølgen kan ha betydning for hastigheten når matrisene har svært ulike størrelser. For tre eller flere matriser bør De vurdere å bruke np.linalg.multi_dot([A, B, C]), som automatisk velger den mest effektive grupperingen.
import numpy as np
A = np.random.rand(100, 20)
B = np.random.rand(20, 50)
C = np.random.rand(50, 10)
result = np.linalg.multi_dot([A, B, C])
print(result.shape) # (100, 10)Vanlige dimensjonsfeil og hvordan De løser dem
Den vanligste feilen ved matrisemultiplikasjon er at formene ikke samsvarer: ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0. Løsningen er å kontrollere formene med A.shape og sørge for at de indre dimensjonene samsvarer. Hvis De har en radvektor med formen (n,) som må behandles som en kolonnevektor med formen (n, 1), bruker De v.reshape(-1, 1). Hvis De trenger transponeringen, bruker De A.T.
import numpy as np
A = np.ones((3, 4))
B = np.ones((3, 4)) # wrong -- inner dims 4 != 3
try:
A @ B
except ValueError as e:
print('Error:', e)
print('Fix:', (A @ B.T).shape) # (3, 3)Praktisk eksempel: transformasjon av egenskaper
Et typisk bruksområde innen datavitenskap er at De har et datasett X med formen (n_samples, n_features) og en vektmatrise W med formen (n_features, n_outputs). Matriseresultatet X @ W utfører en lineær transformasjon på alle observasjoner samtidig, og resultatet får formen (n_samples, n_outputs). Dette er kjerneberegningen i et lineært lag i et nevralt nettverk og ved prediksjon med lineær regresjon.
import numpy as np
n_samples, n_features, n_outputs = 200, 10, 3
X = np.random.rand(n_samples, n_features)
W = np.random.rand(n_features, n_outputs)
b = np.zeros(n_outputs)
predictions = X @ W + b # shape (200, 3)
print(predictions.shape)Hurtigsjekk
Test forståelsen Deres av matrisemultiplikasjon i NumPy.
Oppsummering av leksjonen
I denne leksjonen lærte De at np.matmul og @ utfører ekte matrisemultiplikasjon (ikke elementvis multiplikasjon), at de indre dimensjonene i de to matrisene må samsvare, og at @ støtter satsvis multiplikasjon over ledende dimensjoner. Deretter skal vi se på determinanter, inverse og transponeringer – operasjonene som forteller om en matrise kan «gjøres om».
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 30
- Leksjoner
- 120
Ofte stilte spørsmål
Er leksjonen «Matrise-multiplikasjon med np.matmul og @» gratis?
Ja – hele teksten i «Matrise-multiplikasjon med np.matmul og @» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Pandas & NumPy Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Pandas & NumPy Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Matrise-multiplikasjon med np.matmul og @»?
Multipliser matriser korrekt med np.matmul og operatoren @, og skill elementvis multiplikasjon med * fra ekte matrise-multiplikasjon. Du øver på Pandas & NumPy Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Pandas & NumPy Academy?
Ingen tidligere erfaring er nødvendig. Pandas & NumPy Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Matrise-multiplikasjon med np.matmul og @»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Pandas & NumPy Academy-leksjonen?
Ja. Alle Pandas & NumPy Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Matrise-multiplikasjon med np.matmul og @
- Determinanter, inverse matriser og transponering
- Løsning av lineære systemer
- Oversikt over egenverdier og SVD