圆形浮点值到间隔限制/网格

asc*_*ter 10 python arrays numpy

我有一组(随机)浮点数.我想将每个值四舍五入到任意网格的限制.请参阅以下示例:

import numpy as np
np.random.seed(1)

# Setup
sample = np.random.normal(loc=20, scale=6, size=10)
intervals = [-np.inf, 10, 12, 15, 18, 21, 25, 30, np.inf]

# Round each interval up
for i in range(len(intervals) - 1):
    sample[np.logical_and(sample > intervals[i], sample <= intervals[i+1])] = intervals[i+1]
Run Code Online (Sandbox Code Playgroud)

这导致:

[ 30.  18.  18.  15.  30.  10.  inf  18.  25.  21.]
Run Code Online (Sandbox Code Playgroud)

我该如何避免for循环?我确信有一些方法可以使用我现在看不到的NumPy阵列魔法.

Psi*_*dom 9

如果intervals已排序,您可以使用np.searchsorted:

np.array(intervals)[np.searchsorted(intervals, sample)]
# array([ 30.,  18.,  18.,  15.,  30.,  10.,  inf,  18.,  25.,  21.])
Run Code Online (Sandbox Code Playgroud)

searchsorted 返回元素所属的区间索引:

np.searchsorted(intervals, sample)
# array([7, 4, 4, 3, 7, 1, 8, 4, 6, 5])
Run Code Online (Sandbox Code Playgroud)

默认值side='left'返回此间隔的最小索引,结果将进入左开,右关闭方案.

  • 使用[`timeit`](https://docs.python.org/3/library/timeit.html)将这个答案与@ blue_note和@ pault的答案进行比较:它的速度是blue_note的两倍,并且和pault一样快三倍.(数据的采样被带入时间循环.对于较大的样本/网格,结果可能不同). (2认同)