Atribut array

Membaca shape, ndim, size, dtype, dan itemsize.

Daftar isi

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.

python
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)
text Keluaran
(3, 4)
2
12
int64
8

Setiap 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.

axis 1 (kolom), panjang 4axis 0 (baris), panjang 3809278888574907970827684shape = (3, 4) ndim = 2 size = 12
Array dua dimensi berukuran (3, 4): axis 0 membentang sepanjang baris dan axis 1 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.

python
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)
text Keluaran
(4,)
(1, 4)
1 2

Array 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 size=s0×s1×⋯×sn−1\text{size} = s_0 \times s_1 \times \cdots \times s_{n-1} dengan nn menyatakan banyaknya sumbu. Aturan ini berlaku untuk jumlah dimensi apa pun, termasuk array tiga dimensi yang jarang terlihat pada contoh sederhana.

python
import numpy as np

b = np.zeros((2, 3, 4))
print(b.shape)
print(b.ndim)
print(b.size)
text Keluaran
(2, 3, 4)
3
24

Bentuknya (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.

python
import numpy as np

c = np.zeros((2, 3), dtype=np.float64)
print(c.size)
print(c.itemsize)
print(c.nbytes)
text Keluaran
6
8
48

Atribut 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.

python
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)
text Keluaran
3
12

Fungsi 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#

  • shape menyatakan panjang tiap sumbu, ndim menyatakan banyaknya sumbu, dan size menyatakan total elemen.
  • size selalu sama dengan perkalian panjang semua sumbu pada shape.
  • dtype menentukan itemsize, yaitu byte per elemen, dan nbytes = size × itemsize memberi 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#