numpy.histogram ()은 어떻게 작동합니까?


120

numpy를 읽는 동안 함수를 만났습니다 numpy.histogram().

그것은 무엇이며 어떻게 작동합니까? 문서에서 그들은 쓰레기통 을 언급합니다 : 그들은 무엇입니까?

인터넷 검색을 통해 일반적으로 히스토그램을 정의하게되었습니다 . 알겠습니다. 그러나 불행히도이 지식을 문서에 제공된 예제에 연결할 수 없습니다.

답변:


167

빈은 X 축을 따라 히스토그램의 단일 막대 너비를 나타내는 범위입니다. 이것을 간격이라고 부를 수도 있습니다. (위키피디아는 공식적으로 "분리 된 범주"로 정의합니다.)

Numpy histogram함수는 히스토그램을 그리지 않지만 각 빈에 속하는 입력 데이터의 발생을 계산하여 차례로 각 막대의 영역 (빈이 같지 않은 경우 높이가 아님)을 결정합니다.

이 예에서 :

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

0에서 1 (1 제외), 1에서 2 (2 제외) 및 2에서 3 (3 포함) 범위의 값에 대해 각각 3 개의 빈이 있습니다. Numpy는 [0, 1, 2, 3]이 예에서 구분 기호 ( ) 목록을 제공하여 이러한 빈을 정의하는 방식 이지만, 지정되지 않은 경우 입력에서 자동으로 선택할 수 있기 때문에 결과에 빈을 반환하기도합니다. 경우 bins=5예를 들어, 최소한의 입력 값과 최대 입력 값과 동일한 폭 확산 5 빈을 사용할 것이다.

입력 값은 1, 2 및 1입니다. 따라서 bin "1 to 2"에는 두 개의 발생 (두 1값)이 포함되고 bin "2 to 3"에는 하나의 발생 (the 2)이 포함됩니다. 이러한 결과는 반환 된 튜플의 첫 번째 항목에 array([0, 2, 1])있습니다.

여기에있는 빈은 너비가 같기 때문에 각 막대의 높이에 대해 발생 횟수를 사용할 수 있습니다. 그릴 때 다음을 갖게됩니다.

  • X 축의 범위 / 빈 [0,1]에 대한 높이 0의 막대,
  • 범위 / 빈 [1,2]에 대한 높이 2 막대,
  • 범위 / 빈 [2,3]에 대한 높이 1의 막대.

Matplotlib를 사용하여 직접 플로팅 할 수 있습니다 (해당 hist함수는 bin과 값도 반환합니다).

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

여기에 이미지 설명 입력


8
그림을 그리려면 이 답변에 관심 있을 수도 있습니다 . Matplotlib는 직접 계산할 수도 있습니다 . 여기여기에서 예제를 참조 하십시오 .
Bruno

iris flowers 데이터 세트에서 counts, bin_edges = np.histogram (iris_setosa [ 'petal_length'], bins = 10, density = True)는 부동 값으로 내 카운트를 제공합니다. 부동 가치?
Dipen Gajjar

가장 좋은 답변은 오른쪽 가장 큰 모서리보다 많은 값이 무시된다는 점을 고려해야합니다. 항상 격자 가장자리 위의 값을 마지막 빈에 추가하거나 마지막으로 수동으로 생성 한 bins값을 배열의 최대 값 으로 변경 합니다.
A.Ametov

@DipenGajjar "density = True"를 생략하면 표시되지 않습니다. density 키워드는 확률 밀도 함수가 표시되는 "정규화 된"히스토그램을 제공합니다. 여기에서 그것에 대해 읽을 수 있습니다 .
BUFU

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

아래 hist는 빈 # 0에 0 개, 빈 # 1에 2 개, 빈 # 3에 4 개, 빈 # 4에 1 개 항목이 있음을 나타냅니다.

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

bin_edges 빈 # 0은 간격 [0,1), 빈 # 1은 [1,2), ..., 빈 # 3은 [3,4)임을 나타냅니다.

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

위의 코드를 사용하여 입력을 변경하고 np.histogram작동 방식을 확인하십시오.


그러나 사진은 천 단어의 가치가 있습니다.

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

여기에 이미지 설명 입력


4
나는 이것이 더 정확할 것이라고 생각합니다 : plt.bar(bin_edges[:-1], hist, width=1)그리고 plt.xlim(min(bin_edges), max(bin_edges))막대가 예상 너비에 맞도록 만들기 위해 (그렇지 않으면 사이에 값이없는 더 작은 빈이있을 수 있습니다).
Bruno

"plt.hist (...)"함수에서 위의 numpy 형식으로 얻은 "hist"를 사용할 수 있습니까? bar 방법에서는 "y"로 제공하고 여기에는 hist에 x .. 만 있습니다.
kbg

7

할 수있는 또 다른 유용한 일은 numpy.histogram출력을 선 그래프의 x 및 y 좌표로 플로팅하는 것입니다. 예를 들면 :

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

여기에 이미지 설명 입력

이는 모든 곳에 막대가없는 더 높은 수준의 세분성을 원하는 히스토그램을 시각화하는 유용한 방법이 될 수 있습니다. 극단적 인 픽셀 값을 식별하기위한 이미지 히스토그램에서 매우 유용합니다.


이것은 이미지 행 및 열 투영을 보는 데 매우 유용합니다.
SKR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.