Làm thế nào để numpy.histogram () hoạt động?


119

Trong khi đọc lên numpy, tôi đã gặp chức năng này numpy.histogram().

Nó dùng để làm gìnó hoạt động như thế nào? Trong các tài liệu họ đề cập đến các thùng : Chúng là gì?

Một số googling dẫn tôi đến định nghĩa về Biểu đồ nói chung . Tôi hiểu rồi Nhưng thật không may, tôi không thể liên kết kiến ​​thức này với các ví dụ được đưa ra trong các tài liệu.

Câu trả lời:


166

Một thùng là phạm vi đại diện cho chiều rộng của một thanh đơn của biểu đồ dọc theo trục X. Bạn cũng có thể gọi đây là khoảng thời gian. (Wikipedia định nghĩa chúng chính thức hơn là "các danh mục rời rạc".)

Hàm Numpy histogramkhông vẽ biểu đồ, nhưng nó tính toán sự xuất hiện của dữ liệu đầu vào trong mỗi thùng, từ đó xác định diện tích (không nhất thiết là chiều cao nếu các thùng không có chiều rộng bằng nhau) của mỗi thanh.

Trong ví dụ này:

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

Có 3 thùng, cho các giá trị nằm trong khoảng từ 0 đến 1 (excl 1.), 1 đến 2 (ví dụ 2) và 2 đến 3 (bao gồm 3), tương ứng. Cách Numpy định nghĩa các thùng này nếu bằng cách đưa ra một danh sách các dấu phân cách ( [0, 1, 2, 3]) trong ví dụ này, mặc dù nó cũng trả về các thùng trong kết quả, vì nó có thể chọn chúng tự động từ đầu vào, nếu không được chỉ định. Nếu bins=5, ví dụ, nó sẽ sử dụng 5 thùng của bằng chiều rộng chênh lệch giữa giá trị đầu vào tối thiểu và giá trị đầu vào tối đa.

Các giá trị đầu vào là 1, 2 và 1. Do đó, bin "1 đến 2" chứa hai lần xuất hiện (hai 1giá trị) và bin "2 đến 3" chứa một lần xuất hiện (the 2). Những kết quả này nằm trong mục đầu tiên trong bộ dữ liệu được trả về : array([0, 2, 1]).

Vì các thùng ở đây có chiều rộng bằng nhau, bạn có thể sử dụng số lần xuất hiện cho chiều cao của mỗi thanh. Khi vẽ, bạn sẽ có:

  • một thanh có chiều cao 0 cho phạm vi / bin [0,1] trên trục X,
  • một thanh có chiều cao 2 cho phạm vi / thùng [1,2],
  • một thanh có chiều cao 1 cho phạm vi / thùng [2,3].

Bạn có thể vẽ biểu đồ này trực tiếp với Matplotlib ( histchức năng của nó cũng trả về các thùng và các giá trị):

>>> 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()

nhập mô tả hình ảnh ở đây


8
Bạn cũng có thể quan tâm đến câu trả lời này nếu bạn muốn vẽ chúng. Matplotlib cũng có thể tính toán chúng trực tiếp . Xem ví dụ ở đâyở đây .
Bruno

Trong tập dữ liệu hoa iris, Counts, bin_edges = np.histogram (iris_setosa ['petal_length'], bins = 10, mật độ = True) cung cấp cho tôi số đếm của tôi trong các giá trị nổi, theo ví dụ bạn đã đưa ra làm thế nào có thể đếm được Giá trị thả nổi?
Dipen Gajjar

Câu trả lời tốt nhất nên xem xét rằng số lượng giá trị đáng kể trên cạnh phải lớn nhất sẽ bị bỏ qua. Luôn thêm các giá trị phía trên cạnh lưới vào thùng cuối cùng hoặc thay đổi binsgiá trị được tạo thủ công lần cuối thành giá trị tối đa trong mảng.
A.Ametov

@DipenGajjar Nếu bạn bỏ qua "mật độ = True", bạn sẽ không thấy điều đó. Từ khóa mật độ cung cấp cho bạn biểu đồ "chuẩn hóa" trong đó hàm mật độ xác suất được biểu diễn. Bạn có thể đọc về nó ở đây .
BUFU

66
import numpy as np    
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))

Dưới đây, histchỉ ra rằng có 0 mục trong bin # 0, 2 trong bin # 1, 4 trong bin # 3, 1 trong bin # 4.

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

bin_edges chỉ ra rằng bin # 0 là khoảng [0,1), bin # 1 là [1,2), ..., bin # 3 là [3,4).

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

Chơi với mã trên, thay đổi đầu vào np.histogramvà xem cách nó hoạt động.


Nhưng một bức tranh đáng giá ngàn lời nói:

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

nhập mô tả hình ảnh ở đây


4
Tôi nghĩ rằng điều này sẽ chính xác hơn: plt.bar(bin_edges[:-1], hist, width=1)plt.xlim(min(bin_edges), max(bin_edges)), để làm cho các thanh vừa với chiều rộng dự kiến ​​của chúng (nếu không, có thể chỉ có một thùng nhỏ hơn không có giá trị ở giữa).
Bruno

Có thể sử dụng "hist" thu được ở định dạng numpy ở trên trong hàm "plt.hist (...)" không? Bởi vì trong phương thức thanh, bạn cung cấp nó dưới dạng "y", trong khi ở đây trong hist, chỉ có x ..
kbg

7

Một điều hữu ích khác để làm numpy.histogramlà vẽ đồ thị đầu ra dưới dạng tọa độ x và y trên một sơ đồ đường. Ví dụ:

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()

nhập mô tả hình ảnh ở đây

Đây có thể là một cách hữu ích để trực quan hóa biểu đồ nơi bạn muốn mức độ chi tiết cao hơn mà không có thanh ở khắp mọi nơi. Rất hữu ích trong biểu đồ hình ảnh để xác định các giá trị pixel cực đoan.


Điều này khá hữu ích để xem các hình chiếu hàng và cột.
SKR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.