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:

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

text
[1.23456789e+03 1.23450000e-07 3.14159265e+00]
[1234.568    0.       3.142]

Mari kita bedah:

  1. Baris 4 (print(x)): tampilan bawaan memakai notasi ilmiah dan delapan digit efektif — nilai 0.00000012345 ditulis 1.23450000e-07.
  2. Baris 5 (np.set_printoptions(...)): setelan berlaku global untuk seluruh proses mulai titik ini.
  3. Baris 6: precision=3 memangkas digit; suppress=True membuat 1234.568 ditulis lurus. Elemen tengah menjadi 0. 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 ...:

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

text
[[ 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:

  1. Baris 4 (threshold=20): array berisi 60 elemen melebihi ambang; karena edgeitems bawaan bernilai 3, ditampilkan tiga baris pertama dan tiga baris terakhir.
  2. Baris 6-7 (edgeitems=1): ringkasan dipangkas menjadi satu baris ujung atas, tanda ..., dan satu baris ujung bawah — ringkas untuk laporan.
  3. 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:

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

text
[ 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:

  1. Baris 4 (linewidth=26): dua belas elemen tidak muat dalam 26 karakter, sehingga interpreter memindahkan sisa elemen ke baris kedua.
  2. Baris 6 (np.printoptions(linewidth=100)): di dalam blok with lebar 100 karakter cukup untuk satu baris penuh.
  3. 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:

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

text
np.float64(0.1)
0.1

Penjelasan:

  1. Baris 3: repr bawaan NumPy 2 menyertakan nama kelas — hasil print objek scalar di log terlihat lebih verbose, tetapi aman ditempel kembali ke kode.
  2. Baris 4-5 (legacy="1.25"): setelan ini mengaktifkan aturan tampilan gaya NumPy 1.25 di dalam blok, dan scalar kembali dicetak 0.1.
  3. Bagian print biasa (bukan repr) tetap menampilkan 0.1 pada 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:

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

text
[25,000 1,250,000]
[  25000.  1250000.5]

Kunci pemakaiannya:

  1. Baris 3: dict formatter memetakan kelas tipe ("float", "int", "datetime", dan lainnya) ke fungsi pengubah string; di sini setiap float diformat tanpa desimal dan dengan pemisah ribuan.
  2. Baris 5: setelah reset, tampilan kembali ke format standar — formatter lama tidak ikut terbawa.
  3. Formatter berjalan di Python untuk setiap elemen yang dicetak, jadi gunakan pada laporan kecil, bukan array jutaan elemen.
OpsiPeranNilai bawaan
precisionjumlah digit desimal8
suppresslarang notasi ilmiah kecilFalse
thresholdjumlah elemen sebelum dipangkas ...1000
edgeitemsjumlah baris/kolom ujung yang ditampilkan3
linewidthlebar maksimum satu baris75
legacygaya tampilan versi lamaFalse (gaya NumPy 2)