Parameter axis menentukan arah pengagregatan pada fungsi reduksi, dan salah membacanya membuat angka per baris tertukar dengan angka per kolom. Topik ini membahas makna axis=0 dan axis=1 pada array dua dimensi, bentuk hasil setiap pilihan, cara mengingat aturannya, serta perilakunya pada array satu dimensi. Diagram bentuk disertakan agar arah pergerakan agregasinya terlihat jelas. Dengan aturan tersebut, pengagregatan data tabel per baris maupun per kolom dapat dilakukan dengan tepat.
Makna axis=0 dan axis=1#
Dokumentasi NumPy menyebut sumbu array sebagai axis, dan parameter fungsi reduksinya pun bernama axis. Pada array berbentuk tiga baris dan empat kolom, axis 0 membentang sepanjang baris, sedangkan axis 1 membentang sepanjang kolom. Aturan yang menentukan semuanya berbunyi: sumbu yang disebut pada parameter axis adalah sumbu yang diringkas dan hilang dari hasil. Dengan demikian, axis=0 merangkum baris dan menghasilkan satu nilai untuk setiap kolom, sedangkan axis=1 merangkum kolom dan menghasilkan satu nilai untuk setiap baris.
Ungkapan yang tepat untuk axis=0 karenanya berbunyi mengagregasi sepanjang baris. Perhitungan bergerak dari satu baris ke baris berikutnya sampai seluruh baris habis diringkas, dan hasil akhirnya satu nilai untuk setiap kolom. Sebaliknya, axis=1 mengagregasi sepanjang kolom dan menghasilkan satu nilai per baris.
import numpy as np
skor = np.array([[80, 92, 78, 88], [85, 74, 90, 79], [70, 82, 76, 84]])
print(skor.sum(axis=0))
print(skor.sum(axis=1))
print(skor.sum(axis=0).shape)
print(skor.sum(axis=1).shape)[235 248 244 251]
[338 328 312]
(4,)
(3,)Baris pertama keluaran adalah total setiap kolom, misalnya 235 yang berasal dari 80 + 85 + 70 pada kolom pertama. Baris kedua adalah total setiap baris, misalnya 338 yang berasal dari 80 + 92 + 78 + 88 pada baris pertama. Hasil axis=0 memuat empat nilai karena empat kolom yang tersisa, sedangkan hasil axis=1 memuat tiga nilai karena tiga baris yang tersisa.
Diagram berikut memperlihatkan kedua arah tersebut beserta bentuk hasilnya pada array angka sederhana.
Bentuk hasil dan sumbu negatif#
Bentuk hasil agregasi selalu sama dengan bentuk asal dengan satu perubahan, yaitu panjang sumbu yang disebut menjadi 1 atau hilang. Array berbentuk (3, 4) yang diagregasikan dengan axis=0 menghasilkan (4,), sedangkan dengan axis=1 menghasilkan (3,). Dari sini diperoleh cara memeriksa diri yang praktis: hitung banyaknya nilai hasil, lalu cocokkan dengan panjang sumbu yang tidak diringkas.
Nilai default parameter axis adalah None, yang berarti seluruh sumbu diringkas sekaligus. Dengan nilai default tersebut, array dua dimensi menghasilkan satu bilangan bila axis tidak ditentukan. Adapun bila satu sumbu saja yang diringkas, sumbu-sumbu lain tetap dipertahankan apa adanya.
Nomor sumbu juga boleh ditulis dari belakang, dengan -1 menyatakan sumbu terakhir, -2 sumbu kedua dari belakang, dan seterusnya. Pada array dua dimensi, axis=-1 sama dengan axis=1, sehingga penulisan ini lazim dipakai ketika posisi sumbu terakhir lebih bermakna daripada nomornya.
import numpy as np
skor = np.array([[80, 92, 78, 88], [85, 74, 90, 79], [70, 82, 76, 84]])
print(skor.min(axis=0))
print(skor.max(axis=1))
print(skor.mean(axis=1))
print(skor.sum(axis=-1))[70 74 76 79]
[92 90 84]
[84.5 82. 78. ]
[338 328 312]Hasil min dengan axis=0 memuat nilai terkecil setiap kolom, sedangkan max dan mean dengan axis=1 memuat nilai terbesar dan rata-rata setiap baris. Baris terakhir menunjukkan bahwa axis=-1 menghasilkan total per baris yang sama dengan axis=1, karena sumbu terakhir pada array dua dimensi memang axis 1.
Axis pada array satu dimensi#
Array satu dimensi hanya memiliki satu sumbu, yaitu axis 0. Agregasi dengan axis=0 pada array semacam itu menghasilkan satu bilangan, karena seluruh elemen berada pada sumbu yang sama. Pemanggilan tanpa argumen axis memberikan hasil yang sama dengan axis=0, karena tanpa argumen seluruh sumbu diringkas sekaligus. Nomor sumbu yang sah pada array berdimensi n hanyalah 0 sampai n-1, sehingga penomoran yang salah terdeteksi sebagai error, bukan sebagai hasil yang diam-diam keliru. Contoh pelanggaran aturan itu adalah pemanggilan dengan axis=1, yang menunjuk sumbu yang tidak ada sehingga NumPy memunculkan error AxisError.
import numpy as np
nilai = np.array([72, 85, 60, 90, 78, 88])
print(nilai.sum(axis=0))
try:
print(nilai.sum(axis=1))
except np.exceptions.AxisError as e:
print(f"{type(e).__name__}: {e}")473
AxisError: axis 1 is out of bounds for array of dimension 1Pesan errornya menyatakan bahwa axis 1 berada di luar batas untuk array berdimensi satu. Pesan semacam ini hampir selalu berarti nomor sumbu yang diminta tidak dimiliki array yang bersangkutan, sehingga perbaikannya adalah memeriksa ndim array tersebut terlebih dahulu, baru menentukan nomor sumbu yang sah. Apabila penghitungan per kelompok memang dimaksudkan, array perlu diubah bentuknya menjadi dua dimensi terlebih dahulu, misalnya melalui reshape, agar ada sumbu kedua untuk dipisahkan. Pola yang sama berlaku untuk seluruh fungsi reduksi, bukan hanya sum().
Kesalahan umum#
Kesalahan pertama adalah membaca axis=0 sebagai “bekerja pada baris” sehingga mengharapkan satu nilai per baris. Padahal makna yang benar adalah “meringkas sepanjang baris”, sehingga hasilnya justru satu nilai per kolom. Perbaikannya adalah kembali ke aturan tunggal tersebut, yaitu sumbu yang disebut adalah sumbu yang hilang, kemudian memeriksa bentuk hasilnya. Apabila hasil axis=0 memuat empat nilai pada array berbentuk (3, 4), artinya hasil tersebut berorientasi kolom. Kebalikannya berlaku sebagai pemeriksa cepat, yaitu apabila hasil yang diinginkan satu nilai per baris, maka axis 1 yang harus disebut karena baris itulah yang harus tetap ada pada hasil.
Kesalahan kedua adalah lupa menyertakan axis pada array dua dimensi. Tanpa argumen tersebut, reduksi meringkas seluruh elemen menjadi satu bilangan, yang sering tidak menjadi maksud ketika data tabel sedang dianalisis per baris atau per kolom.
import numpy as np
skor = np.array([[80, 92, 78, 88], [85, 74, 90, 79], [70, 82, 76, 84]])
print(skor.mean())
print(skor.mean(axis=1))81.5
[84.5 82. 78. ]Pemanggilan pertama menghasilkan rata-rata seluruh dua belas nilai, yaitu 81,5, sedangkan pemanggilan kedua menghasilkan rata-rata setiap baris. Kebiasaan yang mencegah kesalahan ini adalah mencantumkan axis secara eksplisit setiap kali orientasi hasil penting, lalu memeriksa shape hasilnya sebelum hasil itu dipakai untuk perhitungan lanjutan.
Ringkasan#
- Sumbu yang disebut pada parameter
axisadalah sumbu yang diringkas dan hilang dari hasil. - Pada array berbentuk
(3, 4),axis=0menghasilkan satu nilai per kolom dengan bentuk(4,), sedangkanaxis=1menghasilkan satu nilai per baris dengan bentuk(3,). - Nomor sumbu negatif dihitung dari belakang, sehingga pada array dua dimensi
axis=-1sama denganaxis=1. - Array satu dimensi hanya memiliki axis 0, dan pemanggilan dengan
axis=1memunculkanAxisError.
Referensi#
- numpy.sum — NumPy
— Dokumentasi resmi parameter
axis, termasuk arti nilai negatif dan bentuk hasilnya. - numpy.mean — NumPy — Dokumentasi resmi rata-rata dengan agregasi per sumbu.
- NumPy: the absolute basics for beginners — NumPy
— Tutorial resmi yang memperkenalkan agregasi dengan parameter
axispada array berdimensi dua.