Setelah shape, atribut ndim adalah pertanyaan paling ringkas yang bisa kita ajukan ke sebuah array: berapa jumlah dimensinya? ndim mengembalikan satu bilangan bulat, yaitu jumlah axis array. Nilai ini berguna saat kita menulis fungsi yang harus bekerja untuk input 1-D maupun 2-D, atau saat memeriksa hasil konversi data dari sumber luar.
Kita tetap memakai data penjualan jaringan toko dari bab sebelumnya sehingga perbandingan antar-array tetap konsisten. Di bab ini kita membaca ndim berbagai array, membedah kasus khusus scalar 0-d, dan mencoba fungsi np.ndim() yang bisa diterapkan pada objek Python biasa.
ndim sebagai jumlah axis #
ndim menyatakan berapa banyak axis, yaitu arah penomoran, yang dimiliki array. Array 1-D punya satu axis, array 2-D punya dua axis (baris dan kolom), dan array 3-D punya tiga axis bersarang. Karena shape menyimpan panjang setiap axis, nilai ndim selalu sama dengan panjang tuple shape.
import numpy as np
penjualan_cabang = np.array([120, 95, 143, 88, 210, 176])
penjualan_harian = np.array([
[85, 90, 78, 102],
[64, 71, 69, 80],
[110, 98, 105, 123],
])
penjualan_wilayah = np.array([
[[85, 90, 78, 102], [64, 71, 69, 80], [110, 98, 105, 123]],
[[70, 75, 82, 88], [58, 62, 60, 71], [95, 99, 91, 104]],
])
print(penjualan_cabang.ndim)
print(penjualan_harian.ndim)
print(penjualan_wilayah.ndim)
print(penjualan_wilayah.ndim == len(penjualan_wilayah.shape))Output yang Dihasilkan:
1
2
3
TrueDua hal perlu kita perhatikan dari kode di atas:
- Baris 14-16 (
print(...ndim)): masing-masing array penjualan menghasilkan ndim1,2, dan3sesuai kedalaman list bersarangnya. - Baris 17 (
...ndim == len(...shape)): panjang tuple shape array 3-D adalah 3, sama dengan ndim-nya, sehingga perbandingan bernilaiTrue.
Tabel berikut merangkum kaitan ndim dengan shape pada contoh kita:
| Objek | ndim | shape |
|---|---|---|
| Array 1-D (enam cabang) | 1 | (6,) |
| Array 2-D (tiga cabang, empat hari) | 2 | (3, 4) |
| Array 3-D (dua wilayah, tiga cabang, empat hari) | 3 | (2, 3, 4) |
Scalar 0-d dan array satu elemen #
Kasus paling ekstrem adalah scalar 0-d: array yang dibuat dari satu angka Python tanpa dibungkus list. Array jenis ini tidak punya axis sama sekali sehingga ndim-nya 0 dan shape-nya tuple kosong (). Jangan sampai tertukar dengan array 1-D berisi satu elemen; array tersebut tetap punya satu axis berpanjang 1.
import numpy as np
skalar = np.array(5)
satu_elemen = np.array([5])
print(skalar.ndim, skalar.shape, repr(skalar))
print(satu_elemen.ndim, satu_elemen.shape)
print(satu_elemen[0])Output yang Dihasilkan:
0 () array(5)
1 (1,)
5Mari kita bedah perbedaannya:
- Baris 3 (
skalar = np.array(5)): angka5dibungkus tanpa list; hasilnya array 0-d dengan ndim0, shape(), dan reprarray(5). - Baris 4 (
satu_elemen = np.array([5])): angka yang sama dibungkus list; hasilnya array 1-d dengan ndim1dan shape(1,). - Baris 8 (
satu_elemen[0]): array 1-D satu elemen masih bisa diindeks karena punya axis; hasilnya5.
Kasus 0-d penting karena muncul tanpa kita sadari sebelumnya. Fungsi agregasi atau pustaka luar kadang mengembalikan angka tunggal dalam bentuk array 0-d, misalnya nilai rata-rata yang belum diambil nilai Pythonnya. Bila kita lupa bahwa array 0-d tidak punya axis, operasi indeks akan menimbulkan error.
Fungsi np.ndim() #
Selain atribut array.ndim, NumPy menyediakan fungsi np.ndim() yang menerima objek apa pun yang bisa dikonversi menjadi array. Fungsi ini praktis saat kita belum yakin input berupa array NumPy atau list Python biasa.
import numpy as np
penjualan_cabang = np.array([120, 95, 143, 88, 210, 176])
print(np.ndim(penjualan_cabang))
print(np.ndim(15000))
print(np.ndim([[85, 90], [64, 71]]))Output yang Dihasilkan:
1
0
2Hasil di atas menunjukkan tiga perilaku np.ndim():
- Baris 5 (
np.ndim(penjualan_cabang)): input array NumPy 1-D menghasilkan1, sama seperti atributndim. - Baris 6 (
np.ndim(15000)): input angka Python murni menghasilkan0, karena angka tunggal dikonversi menjadi array 0-d. - Baris 7 (
np.ndim([[85, 90], [64, 71]])): input list bersarang dua tingkat menghasilkan2; fungsi menghitung kedalaman bersarang tanpa perlu kita konversi manual.