numpy Python -如何获得有效的范围索引

zfciruhq  于 2023-06-29  发布在  Python
关注(0)|答案(1)|浏览(147)

我想得到有效的方法来定位数组中每个元素的范围索引。

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被排序时,我怎么才能让它更有效呢?

qq24tv8q

qq24tv8q1#

定义侧参数'left'和'right',通过减少比较次数来提高np.searchsorted的效率。您可以使用内置的“timeit”模块对np.searchsort和二进制搜索“bisect”进行基准测试,以确定哪种方法更有效

相关问题