gpt4 book ai didi

python - 提取包含另一个数组元素的端点数组行的矢量化方法

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:17 25 4
gpt4 key购买 nike

标题说的是什么。我正在寻找一种快速的 pythonic 方法来提取端点数组 A 的行,该数组包含另一个数组 v

的元素

我想实现的一个简单例子如下:

输入:

A = [[ 4  9]
[15 19]
[20 28]
[31 37]
[43 43]]
v = [ 0 1 2 3 11 12 13 14 26 29 30 31 43]

因为A是一个end-pint数组,也就是说每一行的第一个元素和第二个元素代表一个区间的开始和结束。因为只有 [20 28][31 37][43 43] 的区间包含 v 中的元素(在本例中26,31 和 43 包含在由端点数组 A 创建的区间中),所需的输出是:

[[20 28]
[31 37]
[43 43]]

下面是生成实际输入数组的代码:

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

size = 32000
base_arr = np.arange(size)*10

t1 = np.random.randint(0,6, size)+base_arr
t2 = np.random.randint(5,10, size)+base_arr

A = np.vstack((t1,t2)).T
v = np.sort(np.random.randint(0,10,3*size)+np.repeat(base_arr,3))

提前致谢


编辑:在解释中添加了更多细节

最佳答案

方法 #1

我们可以使用np.searchsorted根据 v 值获取每一行开始和结束元素的左右位置索引,并查找不匹配的索引,这将表明特定行在这些索引中至少有一个元素界限。因此,我们可以简单地做 -

A[np.searchsorted(v,A[:,0],'left')!=np.searchsorted(v,A[:,1],'right')]

方法 #2

另一种方法是使用位于左侧的索引对 v 进行索引,然后查看它们是否小于右侧端点。因此,这将是 -

idx = np.searchsorted(v,A[:,0],'left')
out = A[(idx<len(v)) & (v[idx.clip(max=len(v)-1)]<=A[:,1])]

请注意,这假定 v 已排序并作为数组输入。如果 v 尚未排序,我们需要对其进行排序,然后将其送入。

我这边更大数据集的时间 -

In [65]: %timeit A[np.searchsorted(v,A[:,0],'left')!=np.searchsorted(v,A[:,1],'right')]
2 ms ± 10.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [66]: %%timeit
...: idx = np.searchsorted(v,A[:,0],'left')
...: out = A[(idx<len(v)) & (v[idx.clip(max=len(v)-1)]<=A[:,1])]
1.32 ms ± 7.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

关于python - 提取包含另一个数组元素的端点数组行的矢量化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57121825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com