Data yang kita terima di Python hampir selalu berbentuk list: nilai-nilai yang dikumpulkan dalam loop, baris hasil parsing, atau tabel sederhana berupa list di dalam list. Untuk mengolah kumpulan data tersebut secara cepat, langkah pertama adalah mengonversinya menjadi ndarray. Bab ini membedah perilaku konversi np.array() secara detail, termasuk dua situasi yang paling sering mengejutkan pemula: tipe campuran yang dikonversi diam-diam, dan list bergerigi yang memicu error.
Konversi list satu dimensi dan nested list #
Pada array satu dimensi, np.array() menyalin elemen list ke buffer berurutan. Pada nested list, NumPy membaca setiap list dalam sebagai satu baris:
import numpy as np
nilai = np.array([80, 75, 90])
matriks = np.array([[1, 2, 3], [4, 5, 6]])
print(nilai, nilai.dtype)
print(matriks)
print("shape:", matriks.shape)Output yang Dihasilkan:
[80 75 90] int64
[[1 2 3]
[4 5 6]]
shape: (2, 3)- Baris 3 (
np.array([80, 75, 90])): list sumber menjadi array 1-D bertipeint64. - Baris 4 (
np.array([[1, 2, 3], [4, 5, 6]])): setiap list dalam menjadi satu baris, sehingga hasilnya matriks 2 × 3. - Baris 7 (
matriks.shape):(2, 3)berarti dua baris dengan tiga kolom.
Syaratnya sederhana: semua list dalam harus sama panjang, sehingga hasilnya berbentuk persegi panjang yang rapi.
Konversi tipe campuran (type coercion) #
Array NumPy menuntut satu dtype untuk semua elemen. Ketika list sumber memuat tipe yang berbeda-beda, NumPy tidak memilih per elemen, melainkan mengonversi seluruh elemen ke tipe yang paling umum di antara mereka. Proses ini disebut type coercion:
import numpy as np
campur = np.array([1, 2.5, 3])
teks = np.array(["Budi", "Siti"])
print(campur, campur.dtype)
print(teks, teks.dtype)Output yang Dihasilkan:
[1. 2.5 3. ] float64
['Budi' 'Siti'] <U4- Baris 3 (
np.array([1, 2.5, 3])): ada integer dan float sekaligus, maka semua elemen dinaikkan menjadifloat64; nilai1tampil sebagai1.. - Baris 4 (
np.array(["Budi", "Siti"])): semua elemen bertipe string, sehinggadtypemenjadi<U4— Unicode dengan panjang 4 karakter (panjang string terpanjang,"Budi").
Konversi ini berlaku juga pada kombinasi yang tampak berbahaya. Satu elemen string di antara angka-angka cukup untuk mengubah seluruh array menjadi array string:
import numpy as np
tercampur = np.array([1, "dua", 3])
print(tercampur, tercampur.dtype)Output yang Dihasilkan:
['1' 'dua' '3'] <U21Baris 3 menunjukkan akibatnya: angka 1 dan 3 berubah menjadi string '1' dan '3', dan array yang semestinya bisa dihitung kini berisi teks. Perhatikan juga dtype-nya: <U21, bukan <U3 seperti pada teks di atas. Ketika integer ikut tercampur dalam list, lebar buffer string dihitung dari representasi terlebar yang mungkin untuk integer 64-bit, bukan dari string terpanjang yang kita tulis.
List bergerigi memicu error #
Masalah kedua muncul saat panjang list dalam tidak sama — misalnya [1, 2, 3] bersanding dengan [4, 5]. Bentuk seperti ini tidak dapat diregangkan menjadi tabel persegi panjang, sehingga versi NumPy modern menolaknya dengan ValueError:
import numpy as np
bergerigi = [[1, 2, 3], [4, 5]]
try:
np.array(bergerigi)
except ValueError as e:
print("ValueError:", e)Output yang Dihasilkan:
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part.Pesan error menyebut inhomogeneous shape: NumPy mendeteksi dua baris dengan panjang berbeda pada axis pertama. Kita menangkap error tersebut dengan try/except agar program tidak berhenti dan kita bisa mencetak pesannya.
Tabel berikut merangkum perilaku konversi np.array():
| List sumber | Hasil dtype | Keterangan |
|---|---|---|
[80, 75, 90] | int64 | semua elemen integer |
[1, 2.5, 3] | float64 | tipe campuran dinaikkan ke float |
["Budi", "Siti"] | <U4 | Unicode sepanjang string terpanjang |
[1, "dua", 3] | <U21 | satu string merendahkan semuanya |
[[1, 2, 3], [4, 5]] | memicu ValueError | panjang baris tidak sama |