Tampilan array di terminal bukan hasil kebetulan: NumPy menyimpan sekumpulan print options yang menentukan berapa digit dicetak, kapan array dipangkas dengan tanda ..., dan selebar apa satu baris output. Setelan ini sangat berpengaruh saat laporan analisis dibaca manusia — angka 1.23456789e+03 dan 1234.568 adalah nilai yang sama, tetapi kejelasannya berbeda.
Bab ini menelusuri np.set_printoptions untuk opsi yang paling sering dipakai, konteks manager np.printoptions untuk perubahan sementara, serta satu perubahan besar pada NumPy 2: perilaku repr scalar.
precision dan suppress #
Opsi precision menentukan jumlah digit desimal, sedangkan suppress menonaktifkan notasi ilmiah untuk angka yang sebenarnya cukup ditulis biasa:
import numpy as np
x = np.array([1234.567891, 0.00000012345, 3.14159265])
print(x)
np.set_printoptions(precision=3, suppress=True)
print(x)Output yang Dihasilkan:
[1.23456789e+03 1.23450000e-07 3.14159265e+00]
[1234.568 0. 3.142]Mari kita bedah:
- Baris 4 (
print(x)): tampilan bawaan memakai notasi ilmiah dan delapan digit efektif — nilai0.00000012345ditulis1.23450000e-07. - Baris 5 (
np.set_printoptions(...)): setelan berlaku global untuk seluruh proses mulai titik ini. - Baris 6:
precision=3memangkas digit;suppress=Truemembuat1234.568ditulis lurus. Elemen tengah menjadi0.karena pembulatan tiga digit — nilai kecilnya masih ada di array, hanya tampilannya yang dibulatkan.
threshold dan edgeitems untuk Array Panjang #
Array yang jumlah elemennya melebihi threshold tidak dicetak utuh; NumPy menampilkan ujung-ujungnya sebanyak edgeitems baris/kolom lalu menandai tengahnya dengan ...:
import numpy as np
m = np.arange(60).reshape(6, 10)
np.set_printoptions(threshold=20)
print(m)
np.set_printoptions(threshold=20, edgeitems=1)
print(m)
np.set_printoptions()Output yang Dihasilkan:
[[ 0 1 2 ... 7 8 9]
[10 11 12 ... 17 18 19]
[20 21 22 ... 27 28 29]
[30 31 32 ... 37 38 39]
[40 41 42 ... 47 48 49]
[50 51 52 ... 57 58 59]]
[[ 0 ... 9]
...
[50 ... 59]]Penjelasan tiap bagian:
- Baris 4 (
threshold=20): array berisi 60 elemen melebihi ambang; karenaedgeitemsbawaan bernilai 3, ditampilkan tiga baris pertama dan tiga baris terakhir. - Baris 6-7 (
edgeitems=1): ringkasan dipangkas menjadi satu baris ujung atas, tanda..., dan satu baris ujung bawah — ringkas untuk laporan. - Baris 8 (
np.set_printoptions()): pemanggilan tanpa argumen mengembalikan seluruh opsi ke nilai bawaan.
Mengatur Lebar Baris dengan Konteks printoptions #
Opsi linewidth mengatur lebar maksimum satu baris output; array yang melebihi dibungkus ke baris berikutnya. Untuk perubahan sementara, konteks manager np.printoptions mengembalikan setelan otomatis setelah blok with:
import numpy as np
b = np.arange(12)
np.set_printoptions(linewidth=26)
print(b)
with np.printoptions(linewidth=100):
print(b)Output yang Dihasilkan:
[ 0 1 2 3 4 5 6 7
8 9 10 11]
[ 0 1 2 3 4 5 6 7 8 9 10 11]Bedah:
- Baris 4 (
linewidth=26): dua belas elemen tidak muat dalam 26 karakter, sehingga interpreter memindahkan sisa elemen ke baris kedua. - Baris 6 (
np.printoptions(linewidth=100)): di dalam blokwithlebar 100 karakter cukup untuk satu baris penuh. - Setelah blok
with, lebar baris kembali ke setelan sebelumnya — tanpa perlu menyimpan dan mengembalikan nilai secara manual.
Perubahan repr Scalar pada NumPy 2 dan Opsi legacy #
NumPy 2 mengubah repr scalar float: repr(np.float64(0.1)) kini menampilkan np.float64(0.1), bukan 0.1. Tujuannya agar kode yang ditempel dari output tetap mempertahankan tipenya. Opsi legacy mengembalikan gaya lama ketika dibutuhkan:
import numpy as np
print(repr(np.float64(0.1)))
with np.printoptions(legacy="1.25"):
print(repr(np.float64(0.1)))Output yang Dihasilkan:
np.float64(0.1)
0.1Penjelasan:
- Baris 3: repr bawaan NumPy 2 menyertakan nama kelas — hasil print objek scalar di log terlihat lebih verbose, tetapi aman ditempel kembali ke kode.
- Baris 4-5 (
legacy="1.25"): setelan ini mengaktifkan aturan tampilan gaya NumPy 1.25 di dalam blok, dan scalar kembali dicetak0.1. - Bagian
printbiasa (bukanrepr) tetap menampilkan0.1pada kedua mode; perubahan ini menyasar repr, termasuk saat array scalar dicetak di dalam struktur lain.
formatter untuk Format Khusus #
Ketika opsi siap pakai tidak cukup — misalnya pemisah ribuan ala rupiah — opsi formatter menerima fungsi per kelas tipe:
import numpy as np
np.set_printoptions(formatter={"float": lambda v: f"{v:,.0f}"})
print(np.array([25000.0, 1250000.5]))
np.set_printoptions()
print(np.array([25000.0, 1250000.5]))Output yang Dihasilkan:
[25,000 1,250,000]
[ 25000. 1250000.5]Kunci pemakaiannya:
- Baris 3: dict
formattermemetakan kelas tipe ("float","int","datetime", dan lainnya) ke fungsi pengubah string; di sini setiap float diformat tanpa desimal dan dengan pemisah ribuan. - Baris 5: setelah reset, tampilan kembali ke format standar — formatter lama tidak ikut terbawa.
- Formatter berjalan di Python untuk setiap elemen yang dicetak, jadi gunakan pada laporan kecil, bukan array jutaan elemen.
| Opsi | Peran | Nilai bawaan |
|---|---|---|
precision | jumlah digit desimal | 8 |
suppress | larang notasi ilmiah kecil | False |
threshold | jumlah elemen sebelum dipangkas ... | 1000 |
edgeitems | jumlah baris/kolom ujung yang ditampilkan | 3 |
linewidth | lebar maksimum satu baris | 75 |
legacy | gaya tampilan versi lama | False (gaya NumPy 2) |