Setiap array NumPy membawa dua hal sekaligus, yaitu data nilainya dan metadata yang menjelaskan strukturnya. Topik ini membahas atribut ndarray yang paling sering dibaca, yaitu shape, ndim, size, dtype, dan itemsize, ditambah nbytes untuk ukuran memori. Hubungan antara size dan shape menjadi kunci pembahasan, karena perkalian panjang semua sumbu selalu menghasilkan jumlah elemen.
Metadata yang menyertai data#
Objek ndarray terdiri atas buffer data, yaitu deretan nilai mentah di memori, dan sekumpulan deskriptor yang menjelaskan cara buffer tersebut dibaca. Atribut-atribut berikut memuat deskriptor tersebut. Array contohnya berisi nilai ujian tiga siswa dalam empat mapel, tersusun sebagai tiga baris dan empat kolom.
import numpy as np
a = np.array([[80, 92, 78, 88], [85, 74, 90, 79], [70, 82, 76, 84]])
print(a.shape)
print(a.ndim)
print(a.size)
print(a.dtype)
print(a.itemsize)(3, 4)
2
12
int64
8Setiap baris keluaran menerangkan satu atribut. shape menyatakan panjang tiap sumbu, yaitu tiga baris dan empat kolom. ndim menghitung banyaknya sumbu, sehingga array ini dua dimensi. size adalah total elemen, dan pada array ini nilainya 12. dtype melaporkan tipe datanya, yaitu int64, sedangkan itemsize menyatakan banyaknya byte per elemen, yaitu 8 untuk int64.
Gambar berikut memperlihatkan kedua sumbu pada array yang sama, beserta makna setiap angka pada shape. Sumbu pertama membentang sepanjang baris, sedangkan sumbu kedua membentang sepanjang kolom.
Semua atribut di atas dibaca tanpa memindai isi array, karena nilainya tersimpan pada deskriptor dan bukan dihitung dari data. Membaca size pada array berjuta elemen dengan demikian sama cepatnya dengan array kecil. Atribut-atribut ini juga menjadi sarana pemeriksaan pertama ketika hasil operasi terlihat janggal, karena banyak kesalahan pada pemakaian NumPy berakar pada bentuk yang keliru.
Bentuk satu dimensi dan dua dimensi#
Dua array dapat memuat nilai yang sama dengan struktur yang berbeda, dan shape itulah yang membedakannya. Array satu dimensi memiliki satu sumbu, sedangkan array yang dibungkus satu pasang kurung siku tambahan memiliki dua sumbu.
import numpy as np
v = np.array([4, 8, 15, 16])
m = np.array([[4, 8, 15, 16]])
print(v.shape)
print(m.shape)
print(v.ndim, m.ndim)(4,)
(1, 4)
1 2Array v bertipe satu dimensi dengan shape (4,), yaitu satu sumbu berisi empat elemen. Array m bertipe dua dimensi dengan shape (1, 4), yaitu satu baris berisi empat kolom. Nilai keduanya sama, tetapi struktur berbeda, dan perbedaan struktur ini berpengaruh pada operasi yang melibatkan bentuk.
Perbedaan itu berasal dari jumlah pasangan kurung siku saat pembuatan, bukan dari isinya. Satu pasang kurung menghasilkan satu sumbu, sedangkan dua pasang kurung bersarang menghasilkan dua sumbu meskipun isinya sama persis. Karena itu, membaca kembali cara array dibentuk adalah cara tercepat memahami bentuk yang menyertainya.
Hubungan size dengan shape#
Nilai size selalu sama dengan perkalian panjang semua sumbu, yaitu dengan menyatakan banyaknya sumbu. Aturan ini berlaku untuk jumlah dimensi apa pun, termasuk array tiga dimensi yang jarang terlihat pada contoh sederhana.
import numpy as np
b = np.zeros((2, 3, 4))
print(b.shape)
print(b.ndim)
print(b.size)(2, 3, 4)
3
24Bentuknya (2, 3, 4), sehingga ndim bernilai 3 dan size bernilai 2 × 3 × 4 = 24. Perkalian ini juga berfungsi sebagai pemeriksa cepat. Apabila size yang terbaca tidak sesuai perkiraan, bentuk yang diberikan saat pembuatan kemungkinan salah, dan pemeriksaan shape adalah langkah pertama untuk menelusurinya.
Aturan perkalian ini juga bekerja sebaliknya. Bila total elemen sudah diketahui dan bentuk yang diinginkan memenuhi perkalian yang sama, array dapat disusun ulang ke bentuk tersebut tanpa menambah atau mengurangi datanya. Bentuk (2, 3, 4), (3, 4, 2), dan (4, 6) semuanya memuat 24 elemen, sehingga ketiganya dapat disusun ulang satu sama lain dengan data yang persis sama.
itemsize dan nbytes#
Atribut itemsize menyatakan banyaknya byte untuk satu elemen, dan nilainya ditentukan oleh dtype. int64 dan float64 memakai 8 byte per elemen, float32 memakai 4 byte, dan int8 memakai 1 byte. Dengan demikian, tipe data adalah penentu utama besarnya memori yang dipakai array.
import numpy as np
c = np.zeros((2, 3), dtype=np.float64)
print(c.size)
print(c.itemsize)
print(c.nbytes)6
8
48Atribut nbytes melaporkan total byte seluruh data dan nilainya selalu size × itemsize. Pada array di atas, enam elemen dengan 8 byte per elemen menghasilkan 48 byte. Perkiraan memori untuk array besar dihitung dengan perkalian yang sama, sehingga pertimbangan antara float64 dan float32 dapat dilakukan sebelum data dibuat. Dua array dengan shape yang sama pun dapat memiliki nbytes yang berbeda bila dtype-nya berbeda, karena tipe data dan besarnya memori memang tidak terpisahkan.
Skala perkaliannya nyata pada data besar. Satu juta elemen float64 memakai sekitar delapan megabita, sedangkan float32 memakai sekitar empat megabita untuk data dengan jumlah elemen yang sama. Angka itu berlipat pada setiap salinan array yang dibuat oleh operasi, sehingga pilihan tipe berdampak langsung pada kebutuhan memori program.
Kesalahan umum#
Kesalahan pertama adalah memakai len untuk menghitung jumlah elemen. Fungsi len melaporkan panjang sumbu pertama, sehingga pada array dua dimensi hasilnya jumlah baris, bukan total elemen. Atribut size adalah yang melaporkan jumlah elemen seluruhnya.
import numpy as np
a = np.array([[80, 92, 78, 88], [85, 74, 90, 79], [70, 82, 76, 84]])
print(len(a))
print(a.size)3
12Fungsi len menghasilkan 3 karena sumbu pertamanya memuat tiga baris, sedangkan size menghasilkan 12 karena seluruh isinya berjumlah dua belas elemen. Pada array satu dimensi keduanya kebetulan sama, sehingga kebiasaan keliru ini sering lolos tanpa terasa hingga array dua dimensi dipakai.
Kesalahan kedua adalah membentuk array dua dimensi dari satu list tanpa kurung bersarang. Hasilnya adalah array satu dimensi dengan shape (n,), bukan (1, n). Apabila array satu baris yang dimaksud, bungkus isinya dengan satu pasang kurung siku tambahan, sebagaimana array m pada bagian bentuk satu dimensi dan dua dimensi. Perbaikan yang disarankan adalah memeriksa shape segera setelah array dibentuk, karena atribut ini memperlihatkan jumlah sumbu beserta panjangnya dalam satu tampilan.
Ringkasan#
shapemenyatakan panjang tiap sumbu,ndimmenyatakan banyaknya sumbu, dansizemenyatakan total elemen.sizeselalu sama dengan perkalian panjang semua sumbu padashape.dtypemenentukanitemsize, yaitu byte per elemen, dannbytes=size×itemsizememberi total pemakaian memori data.shape(4,)dan(1, 4)berbeda, yaitu satu sumbu berisi empat elemen berbanding dua sumbu dengan satu baris dan empat kolom.
Referensi#
- The N-dimensional array (ndarray) — NumPy
— Daftar atribut ndarray, termasuk
shape,ndim,size,dtype, danitemsize. - NumPy: the absolute basics for beginners — NumPy — Tutorial resmi yang memperkenalkan atribut array beserta bentuk dan dimensinya.