我有如下数组:
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 非常庞大,这将需要大量内存。
