python - 有效地查找间隔/范围是否是较长间隔/范围的一部分

标签 python numpy numpy-ndarray

我有一个排序的 numpy 2d 数组 x,每行中包含两个间隔的开始位置和结束位置:

[[x_start_1, x_end_1, y_start_1, y_end_1],
 [x_start_2, x_end_2, y_start_2, y_end_2],
 ...
 [x_start_n, x_end_n, y_start_n, y_end_n]]

该数组按 x_start_nx_end_n 之间的长度降序排列。同一行的 xy 间隔的长度始终相同。

问题是:如果给定行中的 xy 间隔是任何 的子间隔,那么最有效和最好的解决方案是什么xy 与上面任意行的间隔?

示例:

array([[35, 39,  1,  5],
       [20, 24,  4,  8],
       [32, 36, 10, 14],
       [35, 38,  1,  4], --> TRUE
       [35, 38, 21, 24],
       [19, 22,  2,  5],
       [36, 39,  2,  5], --> TRUE
       [20, 23,  4,  7], --> TRUE
       [      ...     ]])

我能想到并实现的唯一解决方案是执行双 for 循环并扩展有效行列表,并在下一次迭代中使用它进行比较。

为了更容易可视化:

1.      ---------    |         ---------
2.    -----          |           -----
3.        ---        |            ---          -> TRUE
4.             --    |                --       -> TRUE

感谢您的帮助! <3

最佳答案

这是利用 broadcasting 的矢量化方式-

m1 = x[:,0,None]<=x[:,0]
m2 = x[:,1,None]>=x[:,1]

m3 = x[:,2,None]<=x[:,2]
m4 = x[:,3,None]>=x[:,3]

m12 = m1 & m2
m34 = m3 & m4
out = np.triu((m12 & m34),1).any(0)

示例输入、输出 -

In [2]: x
Out[2]: 
array([[35, 39,  1,  5],
       [20, 24,  4,  8],
       [32, 36, 10, 14],
       [35, 38,  1,  4],
       [35, 38, 21, 24],
       [19, 22,  2,  5],
       [36, 39,  2,  5],
       [20, 23,  4,  7]])

In [3]: out
Out[3]: array([False, False, False,  True, False, False,  True,  True])

关于python - 有效地查找间隔/范围是否是较长间隔/范围的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58326115/

相关文章:

python - np.expand_dims(X_val, -1) 执行什么操作?不明白-1的意义

python - 在 Arch Linux (ARM) 上安装 python2 pandas 模块

python - 计算 python 列表的平均值,不包括文字

python - 为什么创建此内存 View 仅在分配给变量时才会引发 ValueError ?

python - 减少日期值以仅显示一年内的 2 个字符 (Pandas)

python - 连接两个一维 NumPy 数组

python - 多次显示字符串

python - 模型预测时无法为矩阵构建 TypeSpec

python - 如何像 Python numpy.fft.rfft 中那样在 cv::dft 中指定 FFT 长度

python-3.x - 如何从 pandas 数据框中删除包含前两列组合的行