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
要分箱的输入数组.在 NumPy 1.10.0 之前,这个数组必须是 1 维的,但现在可以是任意形状.
- binsarray_like
分箱数组.它必须是 1 维且单调的.
- rightbool, 可选
指示区间是否包含右边缘或左边缘.默认行为是 (right==False),表示区间不包含右边缘.在这种情况下,左端是开放的,即对于单调递增的 bins,bins[i-1] <= x < bins[i] 是默认行为.
- 返回:
- indices整数类型的ndarray
索引的输出数组,形状与 x 相同.
- 提出:
- ValueError
如果 bins 不是单调的.
- TypeError
如果输入的类型是复数.
参见
bincount,histogram,unique,searchsorted
注释
如果 x 中的值使得它们落在 bin 范围之外,则尝试使用
digitize返回的索引来索引 bins 将导致 IndexError.在 1.10.0 版本加入.
numpy.digitize是用numpy.searchsorted实现的.这意味着使用二分查找来对值进行分箱,对于更大数量的 bin,它比之前的线性查找效果更好.它还消除了输入数组是 1 维的要求.对于单调递增的 bins ,以下是等效的:
np.digitize(x, bins, right=True) np.searchsorted(bins, x, side='left')
请注意,由于参数的顺序已反转,因此 side 也必须反转.
searchsorted调用稍微快一些,因为它不进行任何单调性检查. 更重要的是,它支持所有 dtypes.示例
>>> 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])