Dot product memasangkan elemen dua vektor yang seposisi, lalu menjumlahkan hasil kalinya. Ada cara lain memasangkan dua vektor: mengalikan setiap elemen vektor pertama dengan setiap elemen vektor kedua — semua kombinasi pasangan, tanpa penjumlahan. NumPy menyediakan keduanya sebagai np.inner dan np.outer.

Keduanya menerima vektor 1-D sebagai input utama, tetapi hasilnya bergerak ke arah berlawanan:

  • np.inner menyusutkan dua vektor menjadi satu angka (scalar);
  • np.outer mengembangkannya menjadi tabel (n, m) berisi semua hasil kali pasangan.

Inner product: dot product dengan nama lain #

python
import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.inner(a, b))
print(np.dot(a, b))
serupa = np.array([2, 4, 6])
print(np.inner(a, serupa))
berlawanan = np.array([1, 0, -1])
print(np.inner(a, berlawanan))

Output yang Dihasilkan:

text
32
32
28
-2
  1. Baris 5-6 (np.inner vs np.dot): 1*4 + 2*5 + 3*6 = 32, dan kedua fungsi memberi nilai sama — untuk dua vektor 1-D, np.inner dan np.dot identik.
  2. Baris 7-8: serupa adalah kelipatan dua dari a, sehingga arahnya sama; inner product-nya 28, bernilai besar dan positif.
  3. Baris 9-10: berlawanan membuat hasilnya -2 — tanda negatif menandakan kecenderungan arah berlawanan.

Inner product dipakai sebagai ukuran kemiripan arah dua vektor: makin besar nilainya dibanding panjang kedua vektor, makin searah keduanya; nol berarti tegak lurus. Tafsiran yang sama berlaku pada Chapter Dot Product — untuk vektor 1-D, keduanya memang operasi yang sama.

Perbedaan np.inner dan np.dot di dimensi lebih tinggi #

Pada array dengan dimensi lebih dari satu, keduanya berbeda: np.inner menjumlahkan hasil kali atas sumbu terakhir kedua array, sedangkan np.dot memakai sumbu terakhir array kiri dan sumbu kedua-terakhir array kanan:

python
import numpy as np

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])
print(np.inner(A, B))
print(np.dot(A, B))

Output yang Dihasilkan:

text
[[17 23]
 [39 53]]
[[19 22]
 [43 50]]

np.inner(A, B)[0, 1] dihitung dari baris ke-0 A dan baris ke-1 B: 1*7 + 2*8 = 23. Sebaliknya, np.dot(A, B)[0, 1] memakai baris ke-0 A dan kolom ke-1 B: 1*6 + 2*8 = 22. Untuk pekerjaan sehari-hari pada vektor 1-D, perbedaan ini tidak muncul — cukup diingat ketika array bertambah dimensinya.

Outer product: tabel semua kombinasi #

python
import numpy as np

a = np.array([1, 2, 3])
b = np.array([10, 20])
print(np.outer(a, b))
print(np.outer(a, b).shape)

Output yang Dihasilkan:

text
[[10 20]
 [20 40]
 [30 60]]
(3, 2)
  1. Baris 5 (np.outer(a, b)): setiap elemen a dikalikan dengan setiap elemen b, tanpa penjumlahan. Entri (i, j) pada hasil adalah a[i] * b[j] — baris pertama berisi 1*10 dan 1*20, dan seterusnya.
  2. Aturan bentuk: vektor (3,) dipasangkan dengan vektor (2,) menghasilkan matriks (3, 2). Panjang kedua vektor tidak perlu sama.
  3. Tanpa loop: tabel 3×2 itu setara dengan dua loop for bersarang; np.outer menuliskannya dalam satu baris.

Penerapan: tabel perkalian dan kombinasi harga-jumlah #

python
import numpy as np

angka = np.arange(1, 6)
print(np.outer(angka, angka))
harga = np.array([15000, 24000, 8500])
jumlah = np.array([1, 2, 3])
print(np.outer(harga, jumlah))

Output yang Dihasilkan:

text
[[ 1  2  3  4  5]
 [ 2  4  6  8 10]
 [ 3  6  9 12 15]
 [ 4  8 12 16 20]
 [ 5 10 15 20 25]]
[[15000 30000 45000]
 [24000 48000 72000]
 [ 8500 17000 25500]]
  1. Tabel perkalian 1-5: np.outer dari arange(1, 6) dengan dirinya sendiri menghasilkan tabel perkalian klasik; sel (i, j) berisi (i+1) * (j+1).
  2. Kombinasi harga dan jumlah: sel (i, j) berisi total belanja bila membeli jumlah[j] unit produk yang harganya harga[i] — seluruh kemungkinan terhitung sekaligus, tanpa satu baris loop pun.

Tabel berikut merangkum perbandingan keduanya:

Aspeknp.innernp.outer
Input utamadua vektor 1-Ddua vektor 1-D
Syarat panjangkedua vektor sama panjangbebas
Bentuk hasilscalarmatriks (n, m)
Operasikali seposisi, lalu jumlahkali semua kombinasi pasangan
Tafsirankemiripan arahtabel semua kombinasi