Semantik axis

Makna axis=0 dan axis=1 pada agregasi berdimensi dua.

Daftar isi

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.

python Contoh: sum dengan axis=0 dan axis=1
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)
text Keluaran
[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.

axis=0: satu nilai per kolom12345678910111215182124hasil shape (4,)axis=1: satu nilai per baris123456789101112102642hasil shape (3,)array asal: shape (3, 4)
Agregasi sum pada array berbentuk (3, 4): axis=0 merangkum setiap kolom menjadi satu nilai, axis=1 merangkum setiap baris menjadi satu nilai

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.

python Contoh: agregasi per sumbu dengan axis negatif
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))
text Keluaran
[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.

python Contoh: axis=1 pada array satu dimensi
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}")
text Keluaran
473
AxisError: axis 1 is out of bounds for array of dimension 1

Pesan 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.

python Contoh: hasil agregasi tanpa axis dan dengan axis
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))
text Keluaran
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 axis adalah sumbu yang diringkas dan hilang dari hasil.
  • Pada array berbentuk (3, 4), axis=0 menghasilkan satu nilai per kolom dengan bentuk (4,), sedangkan axis=1 menghasilkan satu nilai per baris dengan bentuk (3,).
  • Nomor sumbu negatif dihitung dari belakang, sehingga pada array dua dimensi axis=-1 sama dengan axis=1.
  • Array satu dimensi hanya memiliki axis 0, dan pemanggilan dengan axis=1 memunculkan AxisError.

Referensi#