Python 数亿次数值对对比,如何高效率处理?

开发
对于Python中大数据量的对比,如何高效率处理呢?我们可以使用numpy中的广播和矩阵运算来高效处理。

python有列表a和b,结构都如下所示:[[x1,y1,x2,y2]],x1,y1表示矩形的左下角坐标,x2,y2表示矩形右上角坐标,这样的矩形有n多个(大数据量),遍历a中每一个矩形,找出b中与其相交的矩形,输出a中矩形index和b中相交矩形的index。

如此大数据量的对比,可以使用numpy中的广播和矩阵运算来高效处理。

首先,将a和b转换为numpy数组,方便进行矩阵运算。假设a和b分别为:

a = [[x1_1, y1_1, x2_1, y2_1], [x1_2, y1_2, x2_2, y2_2], ...]
b = [[x1_1, y1_1, x2_1, y2_1], [x1_2, y1_2, x2_2, y2_2], ...]

则可以使用numpy数组的广播功能,将a和b分别扩展成形状为(n,m,4)的数组,其中n和m分别为a和b的长度,4表示每个矩形有4个坐标值。具体实现如下:

import numpy as np

a = np.array(a)
b = np.array(b)

a = np.expand_dims(a, axis=1)
b = np.expand_dims(b, axis=0)

a = np.tile(a, (1, len(b), 1))
b = np.tile(b, (len(a), 1, 1))

这样,a和b就可以进行矩阵运算了。接下来,可以使用numpy的逻辑运算和索引功能,找出与每个a矩形相交的b矩形。具体实现如下:

overlap = np.logical_and(
    np.logical_and(a[:, :, 0] < b[:, :, 2], a[:, :, 2] > b[:, :, 0]),
    np.logical_and(a[:, :, 1] < b[:, :, 3], a[:, :, 3] > b[:, :, 1])
)

result = np.argwhere(overlap)

其中,overlap表示a和b的每个矩形是否相交,result为相交的矩形对的索引。例如,result中的一行表示b中第i个矩形与a中第j个矩形相交。

最后,可以将result中的索引转换为b和a中的矩形索引,输出即可。完整代码如下:

import numpy as np
a = [
    [4,6,7,7],
    [3,3,4,4]
]

b = [
    [9,3,10,4],
    [3,2,5,4],
    [4,6,8,7],
    [3,3,7,7]
]

a = np.array(a)
b = np.array(b)

a = np.expand_dims(a, axis=1)
b = np.expand_dims(b, axis=0)

a = np.tile(a, (1, len(b), 1))
b = np.tile(b, (len(a), 1, 1))

overlap = np.logical_and(
    np.logical_and(a[:, :, 0] < b[:, :, 2], a[:, :, 2] > b[:, :, 0]),
    np.logical_and(a[:, :, 1] < b[:, :, 3], a[:, :, 3] > b[:, :, 1])
)

result = np.argwhere(overlap)

for r in result:
    a_index, b_index = r[0], r[1]
    print("a index: {}, b index: {}".format(a_index, b_index))
责任编辑:赵宁宁 来源: python小王子阿亮
相关推荐

2018-08-17 09:27:17

Photon数据爬虫

2020-03-23 08:36:18

Python编程代码

2015-09-06 16:05:57

绿色数据中心效率

2012-07-16 00:51:36

程序员效率

2010-09-09 16:51:50

2021-11-12 16:54:07

云计算5G云应用

2023-01-10 11:18:29

DevOps

2010-04-13 15:14:31

Oracle优化

2015-11-06 16:17:00

华为ICTC2015

2023-05-17 16:47:47

物联网智能建筑

2010-03-21 19:05:19

微软MSF

2016-12-29 11:41:45

2010-05-07 09:58:27

SQL Server

2020-10-08 15:01:17

开发Java程序员

2022-05-18 09:00:00

人工智能机器学习团队

2018-09-30 14:46:38

Linux命令技巧

2018-05-31 21:16:33

DevOps协作工具开发

2010-08-19 10:18:02

宽带路由器

2015-11-27 12:59:11

Android技巧提高效率

2011-01-11 14:03:52

点赞
收藏

51CTO技术栈公众号