Python 數(shù)億次數(shù)值對對比,如何高效率處理?
python有列表a和b,結(jié)構(gòu)都如下所示:[[x1,y1,x2,y2]],x1,y1表示矩形的左下角坐標(biāo),x2,y2表示矩形右上角坐標(biāo),這樣的矩形有n多個(gè)(大數(shù)據(jù)量),遍歷a中每一個(gè)矩形,找出b中與其相交的矩形,輸出a中矩形index和b中相交矩形的index。
如此大數(shù)據(jù)量的對比,可以使用numpy中的廣播和矩陣運(yùn)算來高效處理。
首先,將a和b轉(zhuǎn)換為numpy數(shù)組,方便進(jìn)行矩陣運(yùn)算。假設(shè)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數(shù)組的廣播功能,將a和b分別擴(kuò)展成形狀為(n,m,4)的數(shù)組,其中n和m分別為a和b的長度,4表示每個(gè)矩形有4個(gè)坐標(biāo)值。具體實(shí)現(xiàn)如下:
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就可以進(jìn)行矩陣運(yùn)算了。接下來,可以使用numpy的邏輯運(yùn)算和索引功能,找出與每個(gè)a矩形相交的b矩形。具體實(shí)現(xiàn)如下:
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的每個(gè)矩形是否相交,result為相交的矩形對的索引。例如,result中的一行表示b中第i個(gè)矩形與a中第j個(gè)矩形相交。
最后,可以將result中的索引轉(zhuǎn)換為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))