我想得到有效的方法来定位数组中每个元素的范围索引。
import numpy as np
def range_index(arr, starts, ends):
_idx_starts = np.searchsorted(starts, arr, side='right')
_idx_ends = np.searchsorted(ends, arr, side='left') + 1
_idx_starts[_idx_starts != _idx_ends] = -1
return _idx_starts
其中:
arr是要索引的排序数组。
starts是排序的起始索引数组。
end是一个有序的end索引数组。
开始和结束没有重叠(np.c_[starts, ends].flatten()
被排序)
它就像
_d = np.linspace(0, 20, 11)
_ranges = np.asarray([
(1, 5),
(7, 9),
(12, 16)
])
_idx = range_index(_d, _ranges[:, 0], _ranges[:, 1])
print(np.c_[_idx, _d])
输出为
[[-1. 0.]
[ 1. 2.]
[ 1. 4.]
[-1. 6.]
[ 2. 8.]
[-1. 10.]
[ 3. 12.]
[ 3. 14.]
[ 3. 16.]
[-1. 18.]
[-1. 20.]]
但是当arr被排序时,我怎么才能让它更有效呢?
1条答案
按热度按时间qq24tv8q1#
定义侧参数'left'和'right',通过减少比较次数来提高np.searchsorted的效率。您可以使用内置的“timeit”模块对np.searchsort和二进制搜索“bisect”进行基准测试,以确定哪种方法更有效