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:

python
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:

text
[80 75 90] int64
[[1 2 3]
 [4 5 6]]
shape: (2, 3)
  1. Baris 3 (np.array([80, 75, 90])): list sumber menjadi array 1-D bertipe int64.
  2. Baris 4 (np.array([[1, 2, 3], [4, 5, 6]])): setiap list dalam menjadi satu baris, sehingga hasilnya matriks 2 × 3.
  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:

python
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:

text
[1.  2.5 3. ] float64
['Budi' 'Siti'] <U4
  1. Baris 3 (np.array([1, 2.5, 3])): ada integer dan float sekaligus, maka semua elemen dinaikkan menjadi float64; nilai 1 tampil sebagai 1..
  2. Baris 4 (np.array(["Budi", "Siti"])): semua elemen bertipe string, sehingga dtype menjadi <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:

python
import numpy as np

tercampur = np.array([1, "dua", 3])
print(tercampur, tercampur.dtype)

Output yang Dihasilkan:

text
['1' 'dua' '3'] <U21

Baris 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:

python
import numpy as np

bergerigi = [[1, 2, 3], [4, 5]]
try:
    np.array(bergerigi)
except ValueError as e:
    print("ValueError:", e)

Output yang Dihasilkan:

text
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 sumberHasil dtypeKeterangan
[80, 75, 90]int64semua elemen integer
[1, 2.5, 3]float64tipe campuran dinaikkan ke float
["Budi", "Siti"]<U4Unicode sepanjang string terpanjang
[1, "dua", 3]<U21satu string merendahkan semuanya
[[1, 2, 3], [4, 5]]memicu ValueErrorpanjang baris tidak sama