Appearance
Numpy Arrays
😊😊😊
Dasar-Dasar NumPy Arrays
Manipulasi data dalam Python hampir identik dengan manipulasi array NumPy. Bahkan, Pandas dibangun di atas array NumPy.
Beberapa kategori manipulasi dasar array yang akan kita bahas di sini adalah:
- Atribut dari array: Menentukan ukuran, bentuk, konsumsi memori, dan tipe data dari array.
- Indeks array: Mengambil dan menetapkan nilai elemen individual dalam array.
- Slicing array: Mengambil dan menetapkan subarray yang lebih kecil dalam sebuah array besar.
- Mengubah bentuk array: Mengubah struktur bentuk dari sebuah array.
- Menggabungkan dan memisahkan array: Menggabungkan beberapa array menjadi satu atau memisahkan sebuah array menjadi beberapa bagian.
Atribut Array NumPy
Pertama, mari kita bahas beberapa atribut penting dari array. Kita akan mulai dengan mendefinisikan array acak satu dimensi, dua dimensi, dan tiga dimensi. Untuk ini, kita akan menggunakan generator angka acak dari NumPy, yang di-seed dengan nilai tetap untuk memastikan hasil acak yang konsisten setiap kali kode dijalankan.
python
import numpy as np
rng = np.random.default_rng(seed=1701) # Seed untuk reproduksi hasil
x1 = rng.integers(10, size=6) # Array satu dimensi
x2 = rng.integers(10, size=(3, 4)) # Array dua dimensi
x3 = rng.integers(10, size=(3, 4, 5)) # Array tiga dimensiSetiap array memiliki atribut seperti berikut:
ndim: Menyatakan jumlah dimensi.shape: Menyatakan ukuran setiap dimensi.size: Menyatakan total jumlah elemen dalam array.dtype: Menyatakan tipe data dari elemen array.
Berikut adalah contohnya:
python
print("x3 ndim: ", x3.ndim)
print("x3 shape:", x3.shape)
print("x3 size: ", x3.size)
print("dtype: ", x3.dtype)Hasil output:
x3 ndim: 3
x3 shape: (3, 4, 5)
x3 size: 60
dtype: int64Indeks Array: Mengakses Elemen Tunggal
Jika Anda sudah akrab dengan indeks daftar (list) standar Python, maka indeks pada NumPy akan terasa serupa. Dalam array satu dimensi, nilai pada indeks ke-𝑖 (mulai dari 0) dapat diakses dengan menyebutkan indeks yang diinginkan dalam tanda kurung siku, sama seperti daftar Python:
python
x1Output:
array([9, 4, 0, 3, 8, 6])Mengakses elemen berdasarkan indeks:
python
x1[0] # Elemen pertamaOutput:
9python
x1[4] # Elemen kelimaOutput:
8Untuk mengakses elemen dari akhir array, Anda bisa menggunakan indeks negatif:
python
x1[-1] # Elemen terakhirOutput:
6python
x1[-2] # Elemen kedua dari belakangOutput:
8Indeks Array pada Array Multidimensi
Pada array multidimensi, elemen dapat diakses menggunakan pasangan indeks yang dipisahkan oleh koma:
python
x2Output:
array([[3, 8, 3, 9],
[4, 6, 5, 3],
[2, 8, 2, 0]])Mengakses elemen tertentu:
python
x2[0, 0] # Elemen di baris pertama, kolom pertamaOutput:
3python
x2[2, 3] # Elemen di baris ketiga, kolom keempatOutput:
0Indeks negatif juga dapat digunakan untuk multidimensi:
python
x2[0, -1] # Elemen di baris pertama, kolom terakhirOutput:
9Modifikasi elemen array juga dimungkinkan menggunakan notasi yang sama:
python
x2[0, 0] = 12
print(x2)Output:
array([[12, 8, 3, 9],
[ 4, 6, 5, 3],
[ 2, 8, 2, 0]])Penting untuk dicatat bahwa array NumPy memiliki tipe data tetap. Jika Anda mencoba menetapkan nilai float ke array integer, nilai float akan dipotong (truncated) menjadi integer:
python
x2[0, 0] = 3.14159 # Nilai float
print(x2)Output:
array([[ 3, 8, 3, 9],
[ 4, 6, 5, 3],
[ 2, 8, 2, 0]])Slicing Array: Mengakses Subarray
Indeks array satu dimensi dapat diperluas menggunakan slicing, yaitu menggunakan tanda :. Bentuk dasar dari slicing adalah:
python
x[start:stop:step]startadalah indeks awal dari slicing (inklusif).stopadalah indeks akhir dari slicing (eksklusif).stepadalah langkah slicing (opsional, default adalah 1).
Jika salah satu parameter dihilangkan, nilai default akan digunakan:
start: Default adalah awal array.stop: Default adalah akhir array.step: Default adalah 1.
Sebagai contoh:
python
x = np.arange(10) # Membuat array dari 0 hingga 9
xOutput:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])python
x[:5] # Lima elemen pertamaOutput:
array([0, 1, 2, 3, 4])python
x[5:] # Elemen dari indeks kelima hingga akhirOutput:
array([5, 6, 7, 8, 9])python
x[::2] # Setiap elemen keduaOutput:
array([0, 2, 4, 6, 8])python
x[1::2] # Setiap elemen kedua, dimulai dari indeks pertamaOutput:
array([1, 3, 5, 7, 9])Indeks negatif dapat digunakan untuk membuat slicing yang lebih fleksibel:
python
x[::-1] # Array terbalikOutput:
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])python
x[5::-2] # Slicing terbalik dengan langkah 2, dimulai dari indeks kelimaOutput:
array([5, 3, 1])Slicing pada Array Multidimensi
Slicing juga dapat digunakan untuk array multidimensi. Notasi slicing diperluas dengan cara menambahkan tanda koma untuk setiap dimensi:
python
x2Output:
array([[12, 8, 3, 9],
[ 4, 6, 5, 3],
[ 2, 8, 2, 0]])python
x2[:2, :3] # Dua baris pertama, tiga kolom pertamaOutput:
array([[12, 8, 3],
[ 4, 6, 5]])python
x2[:, ::2] # Semua baris, setiap kolom keduaOutput:
array([[12, 3],
[ 4, 5],
[ 2, 2]])Oke, kita lanjutkan ke Mengubah Bentuk Array dan topik berikutnya:
Mengubah Bentuk Array
Salah satu fitur penting dari NumPy adalah kemampuannya untuk mengubah bentuk array tanpa mengubah datanya. Operasi ini sering digunakan untuk mempersiapkan data sebelum melakukan perhitungan lebih lanjut.
Metode reshape
Metode reshape memungkinkan Anda untuk menentukan dimensi baru dari array:
python
grid = np.arange(1, 10).reshape((3, 3))
print(grid)Output:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])Di sini, array 1 dimensi dengan 9 elemen (np.arange(1, 10)) diubah menjadi array 2 dimensi berukuran (3, 3).
Catatan: Jumlah elemen dalam dimensi baru harus sama dengan jumlah elemen dalam array asli.
Menambahkan Dimensi Baru dengan np.newaxis
Kadang, Anda perlu menambahkan dimensi baru untuk membuat array lebih fleksibel. Dimensi baru dapat ditambahkan menggunakan np.newaxis.
Misalnya:
python
x = np.array([1, 2, 3])
print(x.shape) # Bentuk asli (3,)Output:
(3,)Menambahkan dimensi baru:
python
x_new = x[:, np.newaxis]
print(x_new.shape) # Bentuk baru (3, 1)Output:
(3, 1)Meratakan Array dengan ravel atau flatten
Jika Anda ingin mengembalikan array multidimensi menjadi 1 dimensi, Anda dapat menggunakan metode ravel atau flatten.
Contoh:
python
grid = np.array([[1, 2, 3], [4, 5, 6]])
print(grid)Output:
array([[1, 2, 3],
[4, 5, 6]])Meratakan array:
python
flat = grid.ravel()
print(flat)Output:
array([1, 2, 3, 4, 5, 6])Menggabungkan dan Memisahkan Array
Menggabungkan Array
NumPy menyediakan beberapa fungsi untuk menggabungkan array, seperti np.concatenate, np.vstack, dan np.hstack.
Menggabungkan Sepanjang Sumbu Anda dapat menggabungkan dua atau lebih array menggunakan
np.concatenate.pythonx = np.array([1, 2, 3]) y = np.array([4, 5, 6]) z = np.concatenate([x, y]) print(z)Output:
array([1, 2, 3, 4, 5, 6])Untuk array 2D:
pythongrid = np.array([[1, 2, 3], [4, 5, 6]]) z = np.concatenate([grid, grid]) print(z)Output:
array([[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]])Menggabungkan Secara Vertikal atau Horizontal
- Gunakan
np.vstackuntuk penggabungan vertikal (menambah baris). - Gunakan
np.hstackuntuk penggabungan horizontal (menambah kolom).
Contoh penggabungan vertikal:
pythonx = np.array([1, 2, 3]) grid = np.array([[9, 8, 7], [6, 5, 4]]) z = np.vstack([x, grid]) print(z)Output:
array([[1, 2, 3], [9, 8, 7], [6, 5, 4]])- Gunakan
Memisahkan Array
Array dapat dipisahkan menggunakan fungsi seperti np.split, np.hsplit, atau np.vsplit.
Memisahkan Sepanjang Sumbu Gunakan
np.splituntuk memisahkan array menjadi beberapa subarray.pythonx = np.arange(10) x1, x2, x3 = np.split(x, [3, 7]) # Memisahkan di indeks 3 dan 7 print(x1, x2, x3)Output:
array([0, 1, 2]) array([3, 4, 5, 6]) array([7, 8, 9])Memisahkan Secara Vertikal atau Horizontal
- Gunakan
np.vsplituntuk memisahkan secara vertikal. - Gunakan
np.hsplituntuk memisahkan secara horizontal.
Contoh pemisahan horizontal:
pythongrid = np.arange(16).reshape((4, 4)) left, right = np.hsplit(grid, [2]) print(left) print(right)Output:
array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]) array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])- Gunakan
Universal Functions (ufunc)
Universal Functions (ufunc) adalah fungsi yang diterapkan elemen-per-elemen pada array NumPy. Fungsi ini sangat cepat karena dioptimalkan menggunakan operasi vektor (vectorized operations).
Operasi Aritmatika Dasar
Operasi seperti penjumlahan, pengurangan, perkalian, dan pembagian dapat dilakukan langsung pada array tanpa perlu iterasi:
python
x = np.array([1, 2, 3, 4, 5])
print(x + 5) # Penambahan skalar
print(x * 2) # Perkalian skalar
print(x ** 2) # PangkatOutput:
[ 6 7 8 9 10]
[ 2 4 6 8 10]
[ 1 4 9 16 25]Operasi antar array juga didukung:
python
y = np.array([5, 4, 3, 2, 1])
print(x + y)
print(x * y)Output:
[6 6 6 6 6]
[ 5 8 9 8 5]Fungsi Matematika Lanjutan
NumPy menyediakan berbagai fungsi matematika yang dioptimalkan:
Fungsi eksponensial dan logaritma:
pythonx = np.array([1, 2, 3]) print(np.exp(x)) # Eksponensial print(np.log(x)) # Logaritma natural print(np.log10(x)) # Logaritma basis 10Output:
[ 2.71828183 7.3890561 20.08553692] [0. 0.69314718 1.09861229] [0. 0.30103 0.47712125]Fungsi trigonometri:
pythontheta = np.linspace(0, np.pi, 3) print(np.sin(theta)) # Sinus print(np.cos(theta)) # Kosinus print(np.tan(theta)) # TangenOutput:
[0.000000e+00 1.000000e+00 1.224647e-16] [ 1.000000e+00 6.123234e-17 -1.000000e+00] [ 0.000000e+00 1.633124e+16 -1.633124e+16]Operasi lain seperti akar kuadrat:
pythonx = np.array([4, 9, 16]) print(np.sqrt(x)) # Akar kuadratOutput:
[2. 3. 4.]
Agregasi Data
Agregasi data digunakan untuk merangkum atau menganalisis nilai dalam array, seperti menjumlahkan elemen, mencari rata-rata, atau menghitung nilai maksimum.
Fungsi Agregasi Sederhana
Fungsi agregasi umum:
np.sum(menjumlahkan elemen)np.mean(menghitung rata-rata)np.max(mencari nilai maksimum)np.min(mencari nilai minimum)np.prod(mengalikan semua elemen)
Contoh:
python
x = np.array([1, 2, 3, 4, 5])
print(np.sum(x)) # Jumlah
print(np.mean(x)) # Rata-rata
print(np.max(x)) # Maksimum
print(np.min(x)) # MinimumOutput:
15
3.0
5
1Agregasi pada Array Multidimensi
Agregasi juga dapat diterapkan pada sumbu tertentu dalam array 2D atau lebih.
Contoh:
python
grid = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(np.sum(grid)) # Semua elemen
print(np.sum(grid, axis=0)) # Sumbu 0 (kolom)
print(np.sum(grid, axis=1)) # Sumbu 1 (baris)Output:
45
[12 15 18]
[ 6 15 24]Perbandingan dan Boolean
NumPy juga memungkinkan operasi berbasis boolean seperti perbandingan:
python
x = np.array([1, 2, 3, 4, 5])
print(x > 3) # Elemen lebih besar dari 3
print(np.any(x > 3)) # Apakah ada elemen > 3?
print(np.all(x > 3)) # Apakah semua elemen > 3?Output:
[False False False True True]
True
FalseBroadcasting
Broadcasting adalah fitur NumPy yang memungkinkan operasi antara array dengan bentuk (shape) berbeda. Dengan broadcasting, NumPy secara otomatis memperluas array lebih kecil agar cocok dengan array yang lebih besar tanpa perlu menyalin data.
Aturan Broadcasting
- Jika kedua array memiliki dimensi berbeda, NumPy akan menambahkan dimensi 1 ke array dengan dimensi lebih kecil di bagian depan.
- Jika ukuran dimensi tidak sama, tetapi salah satu dari dimensinya adalah 1, NumPy akan memperluas dimensi tersebut agar cocok dengan dimensi lainnya.
- Jika kedua dimensi tidak cocok dan tidak ada dimensi 1, maka terjadi ValueError.
Contoh Broadcasting
Penambahan antara skalar dan array:
pythonx = np.array([1, 2, 3]) print(x + 5)Output:
[6 7 8]Operasi antara array 1D dan 2D:
pythonx = np.array([1, 2, 3]) y = np.array([[10], [20], [30]]) print(x + y)Output:
[[11 12 13] [21 22 23] [31 32 33]]Array dengan dimensi berbeda:
pythona = np.array([1, 2, 3]) b = np.array([[1], [2], [3]]) print(a * b)Output:
[[1 2 3] [2 4 6] [3 6 9]]
Manipulasi Data Boolean
NumPy mendukung operasi berbasis boolean untuk memfilter, mencari, atau memodifikasi data dalam array.
Masking (Penyaringan Data)
Masking menggunakan ekspresi boolean untuk menyeleksi elemen tertentu dalam array.
Contoh:
python
x = np.array([1, 2, 3, 4, 5, 6])
mask = x > 3
print(mask) # Masking
print(x[mask]) # Elemen > 3Output:
[False False False True True True]
[4 5 6]Operasi Logika Boolean
Anda dapat menggunakan operator logika seperti & (and), | (or), dan ~ (not).
Contoh:
python
x = np.array([1, 2, 3, 4, 5, 6])
mask = (x > 2) & (x < 5)
print(x[mask]) # Elemen antara 2 dan 5Output:
[3 4]Mengganti Nilai dengan Masking
Masking dapat digunakan untuk mengganti nilai tertentu dalam array.
Contoh:
python
x = np.array([1, 2, 3, 4, 5])
x[x > 3] = 0
print(x)Output:
[1 2 3 0 0]Indexing Lanjutan
Indexing lanjutan memungkinkan Anda memilih elemen dengan cara lebih fleksibel dibandingkan slicing biasa.
Indexing dengan Array
Anda dapat memberikan array lain sebagai indeks.
Contoh:
python
x = np.array([10, 20, 30, 40, 50])
indices = [0, 2, 4]
print(x[indices])Output:
[10 30 50]Indexing dengan Kondisi Boolean
Contoh:
python
x = np.array([1, 2, 3, 4, 5])
print(x[x > 3]) # Elemen lebih besar dari 3Output:
[4 5]Indexing Multidimensi
Indexing lanjutan juga bisa digunakan pada array multidimensi.
Contoh:
python
x = np.array([[1, 2], [3, 4], [5, 6]])
rows = [0, 1, 2]
cols = [1, 0, 1]
print(x[rows, cols])Output:
[2 3 6]Perbandingan Performa dengan Python List
NumPy lebih cepat dibandingkan Python list karena menggunakan array terstruktur (C-level) dan mendukung operasi tervektorisasi.
1. Perbandingan Kecepatan
Contoh penjumlahan elemen pada array besar:
python
import numpy as np
import time
# Dengan Python List
list_data = list(range(1, 10**6))
start = time.time()
result = [x * 2 for x in list_data]
end = time.time()
print(f"Python List: {end - start:.5f} detik")
# Dengan NumPy
np_data = np.arange(1, 10**6)
start = time.time()
result = np_data * 2
end = time.time()
print(f"NumPy: {end - start:.5f} detik")Hasilnya:
Python List: 0.05012 detik
NumPy: 0.00123 detik2. Penggunaan Memori
NumPy menggunakan lebih sedikit memori dibandingkan Python list karena tipe datanya seragam.
Contoh:
python
import sys
list_data = list(range(1, 1000))
np_data = np.arange(1, 1000)
print(f"Memori Python List: {sys.getsizeof(list_data)} bytes")
print(f"Memori NumPy Array: {np_data.nbytes} bytes")Output:
Memori Python List: 8056 bytes
Memori NumPy Array: 4000 bytes