Skip to main content
 首页 » 编程设计

python之检测元素是否在成对的区间限制内

2025年05月04日19JeffreyZhao

我有如下数组:

A = np.array([1, 6,  4, 4, 5, 6]) 
B = np.array([5, 40, 4, 6, 54,7]) #same size as A but every element of B is greater than corresponding element of A 
C = np.array([6, 3]) 

我想找到 A 的所有行和 B这样 C>=A和 C<=B .相同行 A and B形成对,所以必须一起选择。

因此,输出数组将是:

For C[0] = 6 
Aout = [6, 4, 5, 6] 
Bout = [40, 6, 54, 7] 
 
ForC[1] = 3 
Aout = [1] 
Bout = [5] 

因此,最终输出如下:

Aout = [1, 6, 4, 5, 6] 
Bout = [5, 40, 6, 54, 7] 

目前我正在考虑使用 numpy.where并遍历 C 的每个元素但考虑到我的尺码很大 A, B and C这似乎是一个非常低效的过程。

如果使用 pandas 有更简单的方法,我会更喜欢。

请您参考如下方法:

特别是如果你有非常大的 A 和 B 循环遍历 C 的开销几乎可以忽略不计。但是,如果 C 很长而 A 和 B 很短,那么您需要考虑一种广播方法,因为 python 循环会引入一个大量开销。

显式循环的简单方法

mask = np.zeros(A.shape, dtype=bool) 
for item in C: 
    mask |= (A<=item) & (B>=item) 
 
A[mask], B[mask]  # select the valid elements 

广播方式

mask= ((A[:, None]<=C) & (B[:, None]>=C)).max(axis=1) 
 
A[mask], B[mask]  # select the valid elements 

然而,广播方法将创建大的 (size= A.size * C.size) 中间数组,因此如果 A,B 和 C 非常庞大,这将需要大量内存。