Topik ini membahas cara membentuk array NumPy dari list Python serta dari fungsi pembuatan siap pakai seperti np.zeros, np.ones, np.full, dan np.eye. Setiap fungsi dijelaskan bersama aturan bentuk (shape), yaitu ukuran tiap dimensi array, dan tipe data awal yang dihasilkannya. Setelah membaca topik ini, fungsi pembuatan yang tepat untuk kebutuhan tertentu dapat dipilih dengan dasar yang jelas.
Membuat array dari list#
Fungsi np.array mengubah list Python menjadi objek numpy.ndarray, yaitu struktur data array milik NumPy. Nilai dari list disalin ke area memori yang berdampingan, sehingga operasi NumPy berikutnya dapat memproses seluruh nilai sekaligus. Argumennya ditulis persis seperti list biasa, satu list untuk array satu dimensi.
import numpy as np
suhu = np.array([21.5, 22.0, 23.4, 21.8])
print(suhu)
print(type(suhu))[21.5 22. 23.4 21.8]
<class 'numpy.ndarray'>Keluaran menampilkan nilai tanpa tanda koma karena print pada array memakai format NumPy sendiri, bukan format list Python. Tipe objeknya adalah numpy.ndarray, bukan list. Angka 22. pada keluaran adalah cara NumPy menulis 22.0 secara ringkas.
Penyalinan pada np.array bersifat menyeluruh, artinya perubahan pada list asalnya tidak memengaruhi array yang sudah dibentuk, dan sebaliknya. Pemisahan ini penting karena list dan array menyimpan datanya dengan cara berbeda. Sejak array terbentuk, seluruh nilai hidup di buffer memori milik array itu sendiri, sehingga operasi NumPy tidak perlu membaca list asalnya lagi.
List yang bersarang menghasilkan array dua dimensi. Setiap list bagian menjadi satu baris, sehingga jumlah baris ditentukan oleh jumlah list bagian, sedangkan jumlah kolom ditentukan oleh panjang masing-masing list bagian.
import numpy as np
skor = np.array([[80, 92, 78], [85, 74, 90]])
print(skor)[[80 92 78]
[85 74 90]]Syarat ukuran yang seragam#
np.array menuntut list bersarang yang panjangnya seragam. Bila panjang list bagian tidak sama, bentuk array tidak dapat ditentukan dan NumPy menolak pembuatannya dengan error. Kondisi ini disebut tak homogen (inhomogeneous), yaitu data yang tidak dapat dilipat menjadi kisi berukuran tetap.
import numpy as np
data = [[1, 2, 3], [4, 5]]
try:
np.array(data, dtype=float)
except Exception as e:
print(f"{type(e).__name__}: {e}")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.Perbaikan yang paling bersih adalah melengkapi data hingga panjangnya seragam sebelum array dibentuk. Apabila struktur data memang tidak beraturan, np.array masih bisa dipakai dengan dtype=object, tetapi array hasilnya menyimpan objek Python biasa sehingga keunggulan kecepatan NumPy hilang. Untuk data tabular, penyelarasan sebaiknya dilakukan pada sumber datanya.
Syarat seragam ini berlaku pada setiap tingkat kedalaman bersarang. Array tiga dimensi menuntut setiap lapisan list bagian memuat jumlah yang sama, dan begitu seterusnya. Syarat ini bukan pembatasan sembarangan, melainkan konsekuensi dari array yang nilainya disimpan sebagai kisi berukuran tetap. Bila bentuknya tidak dapat dinyatakan dengan rangkaian panjang yang tetap, buffer memori yang seragam tidak dapat disiapkan.
zeros, ones, dan full#
np.zeros dan np.ones membentuk array berisi nol atau satu untuk bentuk yang diberikan, sedangkan np.full mengisi array dengan nilai yang ditentukan sendiri. Argumen pertama ketiganya adalah bentuk array: satu bilangan untuk array satu dimensi, atau tuple untuk lebih dari satu dimensi.
import numpy as np
print(np.zeros(4))
print(np.ones((2, 3)))
print(np.full((2, 2), 7))[0. 0. 0. 0.]
[[1. 1. 1.]
[1. 1. 1.]]
[[7 7]
[7 7]]Perhatikan perbedaan tipe pada keluaran. np.zeros(4) menampilkan 0. dan np.ones((2, 3)) menampilkan 1., tanda bahwa nilainya pecahan, sedangkan np.full((2, 2), 7) menampilkan bilangan bulat. Alasannya dibahas pada bagian tipe data awal di bawah.
np.full menerima dua argumen utama, yaitu bentuk dan nilai pengisi. Bila nilai pengisinya pecahan, array hasilnya juga pecahan, misalnya np.full(3, 2.5) menghasilkan tiga elemen bernilai 2.5. Pola argumen yang sama berlaku untuk np.zeros dan np.ones, sehingga ketiganya mudah dipertukarkan.
Matriks identitas dengan eye#
np.eye(n) membentuk matriks persegi berukuran n × n dengan angka satu pada diagonal utama dan nol pada posisi lainnya. Diagonal utama adalah posisi yang nomor barisnya sama dengan nomor kolomnya. Matriks semacam ini disebut matriks identitas karena perkalian matriks apa pun dengannya tidak mengubah nilai, sebagaimana angka satu pada perkalian biasa.
import numpy as np
print(np.eye(3))[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]Fungsi ini juga menerima parameter k untuk menggeser diagonal, yaitu k=1 menempatkan satu pada diagonal di atas utama dan k=-1 pada diagonal di bawahnya. Nilai yang dihasilkan np.eye bertipe pecahan sesuai bawaannya. Pada praktiknya, matriks identitas dipakai sebagai titik awal yang netral sebelum diagonalnya diisi bobot tertentu.
Ukuran np.eye tidak terbatas pada matriks kecil. Dengan satu argumen, panjang dan lebar memakai angka yang sama, sehingga bentuk keluarannya selalu persegi. Apabila matriks dengan panjang dan lebar berbeda diperlukan, fungsi ini menerima argumen kedua, sehingga np.eye(3, 4) menghasilkan tiga baris dan empat kolom dengan satu pada diagonal utamanya.
Tipe data awal hasil pembuatan#
Setiap fungsi pembuatan memiliki pilihan tipe data bawaan yang berbeda. np.array dari list bilangan bulat menghasilkan int64, sedangkan np.zeros dan np.ones menghasilkan float64 karena pecahan dipilih sebagai nilai yang aman untuk perhitungan umum. np.full mengikuti tipe nilai pengisinya. Pilihan bawaan tersebut diubah dengan parameter dtype.
import numpy as np
a = np.array([10, 20, 30])
b = np.zeros(3)
c = np.ones(3, dtype=int)
print(a.dtype)
print(b.dtype)
print(c.dtype)int64
float64
int64Satu hal yang perlu dicatat pada keluaran pertama, nilai int64 berasal dari platform 64-bit yang dipakai saat dijalankan, dan platform lain dapat melaporkan int32 untuk data yang sama. Karena itu, kode yang menuntut tipe tertentu sebaiknya menuliskannya secara eksplisit dan tidak mengandalkan tebakan bawaan.
Parameter dtype diterima semua fungsi di topik ini, termasuk np.array dan np.full. Pemilihan tipe secara eksplisit penting ketika memori menjadi pertimbangan atau ketika operasi berikutnya menuntut tipe tertentu. Keluarga tipe data NumPy mencakup int8 hingga int64 untuk bilangan bulat serta float32 dan float64 untuk pecahan.
Kesalahan umum#
Bentuk array multi-dimensi dikirim sebagai dua angka terpisah, misalnya np.zeros(3, 4). NumPy membaca angka kedua sebagai tipe data, sehingga muncul error yang kelihatannya tidak berhubungan dengan bentuk. Bentuk multi-dimensi selalu dikirim sebagai satu tuple, yaitu np.zeros((3, 4)).
import numpy as np
try:
np.zeros(3, 4)
except Exception as e:
print(f"{type(e).__name__}: {e}")TypeError: Cannot interpret '4' as a data typeKesalahan kedua adalah membentuk array dari list bersarang yang panjangnya tidak seragam dengan harapan NumPy menoleransinya. NumPy menolaknya dengan ValueError, sebagaimana ditunjukkan pada bagian Syarat ukuran yang seragam. Rapikan data hingga panjangnya seragam sebelum np.array dipanggil.
Kesalahan ketiga adalah mengirim beberapa list sebagai argumen terpisah, misalnya np.array([1, 2], [3, 4]) dengan harapan membentuk dua baris. NumPy membaca argumen kedua sebagai penentu tipe data, sehingga muncul error yang pesannya membingungkan. Bentuk yang benar adalah satu list bersarang, yaitu np.array([[1, 2], [3, 4]]), sebagaimana dipakai pada bagian awal topik ini.
Ketiga kasus di atas memiliki pola yang sama, yaitu pesan errornya tidak langsung menunjuk argumen yang salah. Membaca ulang panggilan fungsi sambil memeriksa urutan argumennya biasanya cukup untuk menemukan penyebabnya.
Ringkasan#
np.arraymenyalin list, termasuk list bersarang yang panjangnya seragam, menjadinumpy.ndarray.np.zeros,np.ones, dannp.fullmembentuk array berisi nilai tetap, dengan argumen bentuk berupa satu bilangan untuk satu dimensi atau satu tuple untuk beberapa dimensi.np.eye(n)menghasilkan matriks identitas berukuran n × n dengan satu pada diagonal utama.- Tipe data bawaannya berbeda tiap fungsi, yaitu
int64untuknp.arraydari bilangan bulat,float64untuknp.zerosdannp.ones, dan tipe sesuai nilai pengisi untuknp.full. Parameterdtypemengubah pilihan tersebut.
Referensi#
- Array creation — NumPy — Panduan resmi cara membuat array dari data maupun fungsi pembuatan.
- Array creation routines — NumPy
— Daftar lengkap
np.array,np.zeros,np.ones,np.full, dannp.eyebeserta parameternya.