numpy.digitize#

numpy.digitize(x, bins, right=False)[源代码]#

返回输入数组中每个值所属的 bin 的索引.

right

bin 的顺序

返回的索引 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

要进行分箱的输入数组.在 NumPy 1.10.0 之前,此数组必须是一维的,但现在可以具有任何形状.

binsarray_like

bin 的数组.它必须是一维且单调的.

rightbool,可选

指示间隔是否包含右侧或左侧的 bin 边缘.默认行为是 (right==False),表示间隔不包含右侧边缘.在这种情况下,左侧 bin 端是开放的,即 bins[i-1] <= x < bins[i] 是单调递增 bin 的默认行为.

返回:
indices整数的 ndarray

索引的输出数组,与 x 的形状相同.

Raises:
ValueError

如果 bins 不是单调的.

TypeError

如果输入的类型是复数.

注释

如果 x 中的值使得它们落在 bin 范围之外,则尝试使用 digitize 返回的索引来索引 bins 将导致 IndexError.

在 1.10.0 版本加入.

numpy.digitize 是根据 numpy.searchsorted 实现的.这意味着使用二分查找来对值进行分箱,这对于大量的 bin 来说,比之前的线性查找效果更好.它还消除了输入数组必须是一维的要求.

对于单调递增的 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])