numpy.digitize#
- numpy.digitize(x, bins, right=False)[原始碼]#
傳回輸入陣列中每個值所屬的 bin 的索引。
right
bins 的順序
傳回的索引 i 滿足
False
遞增
bins[i-1] <= x < bins[i]
True
遞增
bins[i-1] < x <= bins[i]
False
遞減
bins[i-1] > x >= bins[i]
True
遞減
bins[i-1] >= x > bins[i]
如果 x 中的值超出 bins 的範圍,則會適當地傳回 0 或
len(bins)
。- 參數:
- xarray_like
要分 bin 的輸入陣列。在 NumPy 1.10.0 之前,此陣列必須是 1 維的,但現在可以是任何形狀。
- binsarray_like
bin 的陣列。它必須是 1 維且單調的。
- rightbool, optional
指示間隔是否包含右邊或左邊的 bin 邊緣。預設行為是 (right==False),表示間隔不包含右邊邊緣。在這種情況下,左邊 bin 邊緣是開放的,即對於單調遞增的 bins,bins[i-1] <= x < bins[i] 是預設行為。
- 傳回值:
- indicesndarray of ints
索引的輸出陣列,與 x 具有相同的形狀。
- 引發:
- ValueError
如果 bins 不是單調的。
- TypeError
如果輸入的類型是複數。
參見
註解
如果 x 中的值超出 bin 範圍,嘗試使用
digitize
傳回的索引來索引 bins 將導致 IndexError。在版本 1.10.0 中新增。
numpy.digitize
是根據numpy.searchsorted
實作的。這表示使用二元搜尋來對值進行 bin 分組,對於較大數量的 bins 來說,這種方法比之前的線性搜尋更有效率。它也移除了輸入陣列必須是 1 維的要求。對於單調遞增的 bins,以下是等效的
np.digitize(x, bins, right=True) np.searchsorted(bins, x, side='left')
請注意,由於參數的順序已反轉,因此 side 也必須反轉。
searchsorted
呼叫速度稍快,因為它不會進行任何單調性檢查。也許更重要的是,它支援所有 dtype。範例
>>> import numpy as np >>> x = np.array([0.2, 6.4, 3.0, 1.6]) >>> bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0]) >>> inds = np.digitize(x, bins) >>> inds array([1, 4, 3, 2]) >>> for n in range(x.size): ... print(bins[inds[n]-1], "<=", x[n], "<", bins[inds[n]]) ... 0.0 <= 0.2 < 1.0 4.0 <= 6.4 < 10.0 2.5 <= 3.0 < 4.0 1.0 <= 1.6 < 2.5
>>> x = np.array([1.2, 10.0, 12.4, 15.5, 20.]) >>> bins = np.array([0, 5, 10, 15, 20]) >>> np.digitize(x,bins,right=True) array([1, 2, 3, 4, 4]) >>> np.digitize(x,bins,right=False) array([1, 3, 3, 4, 5])