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

时间:2019-10-10 15:11:58

标签: 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间隔是否为任何x和{{1 }}与以上任何行之间的间隔?

示例:

y

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

为便于可视化:

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
       [      ...     ]])

感谢您的帮助! <3

1 个答案:

答案 0 :(得分:0)

这是利用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])
相关问题