Bagaimana cara kerja numpy.histogram ()?

120

Saat membaca di numpy, saya menemukan fungsinya numpy.histogram().

Untuk apa dan bagaimana cara kerjanya? Dalam dokumen yang mereka sebutkan tempat sampah : Apa itu?

Beberapa googling membawa saya pada definisi Histogram secara umum . Saya mengerti. Namun sayangnya saya tidak dapat menghubungkan pengetahuan ini dengan contoh yang diberikan di dokumen.

Aufwind
sumber

Jawaban:

167

Bin adalah rentang yang mewakili lebar satu batang histogram di sepanjang sumbu X. Anda juga bisa menyebutnya sebagai interval. (Wikipedia mendefinisikannya secara lebih formal sebagai "kategori terpisah".)

Fungsi Numpy histogramtidak menggambar histogram, tetapi menghitung kemunculan data input yang termasuk dalam setiap nampan, yang pada gilirannya menentukan luas (tidak harus tingginya jika nampan tidak memiliki lebar yang sama) dari setiap batang.

Dalam contoh ini:

 np.histogram([1, 2, 1], bins=[0, 1, 2, 3])

Ada 3 bin, untuk nilai mulai dari 0 hingga 1 (tidak termasuk 1.), 1 hingga 2 (tidak termasuk 2) dan 2 hingga 3 (termasuk 3), masing-masing. Cara Numpy mendefinisikan bins ini jika dengan memberikan daftar pembatas ( [0, 1, 2, 3]) dalam contoh ini, meskipun Numpy juga mengembalikan bins dalam hasil, karena ia dapat memilihnya secara otomatis dari input, jika tidak ada yang ditentukan. Jika bins=5, misalnya, akan menggunakan 5 bin dengan lebar yang sama tersebar antara nilai input minimum dan nilai input maksimum.

Nilai inputnya adalah 1, 2 dan 1. Oleh karena itu, bin "1 hingga 2" berisi dua kemunculan (dua 1nilai), dan bin "2 hingga 3" berisi satu kemunculan (the 2). Hasil ini pada item pertama dalam tuple kembali: array([0, 2, 1]).

Karena kotak di sini memiliki lebar yang sama, Anda dapat menggunakan jumlah kemunculan untuk tinggi setiap batang. Saat digambar, Anda akan memiliki:

  • batang dengan tinggi 0 untuk range / bin [0,1] pada sumbu X,
  • batang dengan tinggi 2 untuk rentang / bin [1,2],
  • batang dengan tinggi 1 untuk jangkauan / bin [2,3].

Anda dapat memplot ini secara langsung dengan Matplotlib ( histfungsinya juga mengembalikan bin dan nilainya):

>>> import matplotlib.pyplot as plt
>>> plt.hist([1, 2, 1], bins=[0, 1, 2, 3])
(array([0, 2, 1]), array([0, 1, 2, 3]), <a list of 3 Patch objects>)
>>> plt.show()

masukkan deskripsi gambar di sini

Bruno
sumber
8
Anda mungkin juga tertarik dengan jawaban ini jika Anda ingin merencanakannya. Matplotlib juga dapat menghitungnya secara langsung . Lihat contoh di sini dan di sini .
Bruno
Dalam dataset bunga iris, counts, bin_edges = np. Histogram (iris_setosa ['petal_length'], bins = 10, density = True) memberi saya hitungan saya dalam nilai mengambang, sesuai dengan contoh yang telah Anda berikan bagaimana menghitung bisa menjadi a nilai mengambang?
Dipen Gajjar
Jawaban terbaik harus memperhitungkan bahwa sejumlah besar nilai di atas tepi kanan terbesar akan diabaikan. Selalu tambahkan nilai di atas tepi kisi ke nampan terakhir atau ubah binsnilai yang dibuat secara manual terakhir ke nilai maksimum dalam larik.
A.Ametov
@DipenGajjar Jika Anda menghilangkan "density = True", Anda tidak akan melihatnya. Kata kunci kepadatan memberi Anda histogram "dinormalisasi" di mana fungsi kepadatan probabilitas diwakili. Anda bisa membacanya di sini .
BUFU
67
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

Di bawah ini, histmenunjukkan bahwa ada 0 item di bin # 0, 2 di bin # 1, 4 di bin # 3, 1 di bin # 4.

print(hist)
# array([0, 2, 4, 1])   

bin_edges menunjukkan bahwa bin # 0 adalah interval [0,1), bin # 1 adalah [1,2), ..., bin # 3 adalah [3,4).

print (bin_edges)
# array([0, 1, 2, 3, 4]))  

Mainkan dengan kode di atas, ubah input ke np.histogramdan lihat cara kerjanya.


Tapi sebuah gambar bisa bermakna ribuan kata:

import matplotlib.pyplot as plt
plt.bar(bin_edges[:-1], hist, width = 1)
plt.xlim(min(bin_edges), max(bin_edges))
plt.show()   

masukkan deskripsi gambar di sini

unutbu
sumber
4
Saya pikir ini akan lebih akurat: plt.bar(bin_edges[:-1], hist, width=1)dan plt.xlim(min(bin_edges), max(bin_edges)), untuk membuat batang sesuai dengan lebar yang diharapkan (jika tidak, mungkin hanya ada bin yang lebih kecil tanpa nilai di antaranya).
Bruno
Apakah mungkin untuk menggunakan "hist" yang diperoleh dalam format numpy di atas dalam fungsi "plt.hist (...)"? Karena dalam metode bar, Anda memasukkannya sebagai "y", sedangkan di histori, hanya ada x ..
kbg
7

Hal lain yang berguna untuk dilakukan dengan numpy.histogrammemplot keluaran sebagai koordinat x dan y pada grafik garis. Sebagai contoh:

arr = np.random.randint(1, 51, 500)
y, x = np.histogram(arr, bins=np.arange(51))
fig, ax = plt.subplots()
ax.plot(x[:-1], y)
fig.show()

masukkan deskripsi gambar di sini

Ini dapat menjadi cara yang berguna untuk memvisualisasikan histogram di mana Anda menginginkan tingkat perincian yang lebih tinggi tanpa bilah di mana-mana. Sangat berguna dalam histogram gambar untuk mengidentifikasi nilai piksel yang ekstrim.

Grr
sumber
Ini cukup berguna untuk melihat proyeksi baris dan kolom gambar.
SKR