DataLens

Attribute array (shape, dtype, ndim)

Baca shape, ukuran dan tipe elemen sebuah array, konversi antar tipe, dan hindari overflow yang senyap.

Level: Dasar · 9 menit baca

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Idenya

Saat sebuah DataFrame atau model protes, hal pertama yang perlu diperiksa adalah array di baliknya: apa shape-nya, dan apa tipe elemennya? "Expected 2D array, got 1D" dan "cannot convert string to float" termasuk error paling umum dalam pekerjaan data, dan keduanya dijawab oleh attribute sebuah array.

Shape, ndim dan size

Ini tabel unit terjual yang sama dari modul sebelumnya: tiga toko sebagai baris, enam bulan sebagai kolom. Tiga attribute memberi tahu ukurannya, dan itu hal pertama yang perlu dicek setiap kali ada error yang menyebut dimensi:

import numpy as np

units = np.array([
    [120, 135, 150, 160, 155, 170],
    [ 80,  85,  90,  88,  95, 100],
    [ 95,  92, 105, 110, 108, 115],
])
print(units.shape)
print(units.ndim)
print(units.size)
(3, 6)
2
18
AttributeArtinyaDi sini
.shapeukuran di sepanjang setiap dimensi, sebagai tuple(3, 6): 3 baris, 6 kolom
.ndimjumlah dimensi2
.sizejumlah total elemen18

Ini attribute, bukan method, jadi tidak pakai tanda kurung: units.shape, bukan units.shape().

Shape array 1-D adalah tuple berisi satu angka, ditulis dengan koma di belakang:

daily = np.array([42, 38, 51, 47])
print(daily.shape, daily.ndim)
(4,) 1

(4,) berarti "4 elemen di sepanjang satu dimensi". Perhatikan perbedaan antara (4,) dan (4, 1) (4 baris, 1 kolom): library machine learning sangat memedulikannya, dan kamu akan belajar mengonversi di antara keduanya di modul reshaping.

dtype: tipe elemen

Setiap array punya satu dtype (tipe data) yang sama untuk semua elemennya:

print(np.array([1.5, 2.0]).dtype)
print(np.array([True, False]).dtype)
print(np.array(["Jakarta", "Bandung"]).dtype)
float64
bool
<U7
dtypeMenyimpanByte per elemen
int64, int32, int16, int8bilangan bulat8, 4, 2, 1
float64, float32desimal8, 4
boolTrue / False1
<U8teks, sampai 8 karakter4 per karakter

Angka di namanya adalah ukuran dalam bit: int64 memakai 64 bit = 8 byte per elemen.

Integer default tergantung komputermu

Apa dtype dari np.array([1, 2, 3])? Di sebagian besar laptop dan server jawabannya int64. Di situs ini jawabannya int32, karena Python di sini berjalan di dalam browser-mu pada platform 32-bit (WebAssembly). Instalasi NumPy di Windows versi lama juga memakai int32. Coba di editor:

print(np.array([1, 2, 3]).dtype)
int32

Saat ukuran integer itu penting, misalnya untuk total uang yang besar, nyatakan secara eksplisit dengan dtype=np.int64. Eksplisit lebih baik daripada "apa pun yang dilakukan mesin ini".

itemsize dan nbytes: memori

Dtype juga menentukan berapa banyak memori yang dipakai setiap angka. Itu tidak penting untuk array kecil, tapi cepat bertambah pada array besar. Kedua attribute ini menunjukkan biayanya:

prices = np.array([185.0, 320.0, 95.0, 65.0], dtype=np.float64)
print(prices.itemsize, prices.nbytes)

small = prices.astype(np.float32)
print(small.itemsize, small.nbytes)
8 32
4 16

itemsize adalah byte per elemen, nbytes adalah totalnya. Untuk empat angka ini sepele; untuk array 100 juta baris, float32 alih-alih float64 menghemat 400 MB. Machine learning sering memakai float32 tepat karena alasan itu.

Mengonversi tipe: astype

Kadang sebuah array punya nilai yang benar tapi tipe yang salah untuk langkah berikutnya, seperti harga berdesimal yang harus menjadi rupiah utuh. .astype(new_dtype) mengembalikan array baru dengan setiap nilai dikonversi ke tipe lain:

prices = np.array([185.9, 320.4, 95.5])
print(prices.astype(int))
print(prices.round().astype(int))
[185 320  95]
[186 320  96]
Awas

Mengonversi float ke integer memotong desimalnya (185.9 menjadi 185); tidak membulatkan. Bulatkan dulu kalau yang kamu maksud adalah pembulatan.

Ini juga mengonversi teks yang dibaca dari file menjadi angka:

raw = np.array(["120", "135", "150"])
print(raw.astype(int).sum())
405

Overflow: saat angka tidak muat

Setiap tipe integer punya rentang. int8 menampung -128 sampai 127. Lewati ujungnya, dan nilainya berputar balik secara diam-diam:

stock = np.array([120, 125], dtype=np.int8)
print(stock + 10)
[-126 -121]

Tanpa error, tanpa warning, hanya angka yang salah: 130 tidak muat di int8, jadi berputar menjadi -126. Integer bawaan Python tidak pernah overflow, tapi integer berukuran tetap milik NumPy bisa. int32 mentok di sekitar 2,1 miliar, yang dengan mudah dilewati oleh revenue setahun dalam Rupiah.

print(np.iinfo(np.int32).max)
print(np.iinfo(np.int64).max)
2147483647
9223372036854775807

Itulah sebabnya track ini menyimpan Rupiah dalam ribuan, dan kenapa kamu akan memakai int64 (atau float64) untuk total uang yang besar.

Mengapa ini penting untuk kode yang bersih

Bug shape dan dtype itu senyap: dtype yang salah menghasilkan angka yang salah, bukan error. Buat tipe eksplisit di tempat yang penting (dtype=np.int64 untuk uang, float32 untuk array ML yang besar), bulatkan sebelum mengonversi ke integer, dan saat sesuatu berperilaku aneh, print .shape dan .dtype dulu. Ini padanan NumPy dari memeriksa satuan di fisika.

Rangkuman

Latihan modul ini

Soal-soal untuk pelajaran ini berjalan di browser-mu dan langsung mengecek jawabanmu.

Berikutnya: Indexing dan slicing →