Numpy矩阵计算应用——来自一个小白的学习记录

导火索

应客户要求,要匹配出A、B表中两两门店间的距离。其中A表共有1939家门店,B表共有1081家门店。

python 距离计算出行时间_数组

原始思路
1、计算两两门店之间的距离
实现方法:用两层for循环,依次提取每一对门店的经纬度,套用距离函数进行计算
2、把门店除经纬度之外其他信息,匹配进来
实现方法:(问题: 两个Dataframe可以实现笛卡尔积拼接嘛,没有搜到办法)也用两层for循环试试,依次从两个Dataframe中提取信息,拼接成一行,再把结果依次添加到1个空的Datarame中
3、把1和2两部分concat在一起

遇到的问题
for循环操作,数据量会出现乘数效应,内存爆掉。跑了很久也没跑出来,等下去大概率也是不行的。。

最终解决方法:矩阵运算 + stack + merge

1、提取AB两表中的经纬度数据:

是两个Dataframe, shape分别为1939×2 、 1081×2

2、距离计算:

这里先来思考下矩阵的构造:行 列,其实就是平面意义上对每一行,把所有列循环一遍,等同于两层 for循环的功能。而Numpy的强大之处在这里恰好可以得到体现,即不需要使用循环,Numpy的数组之间就可以直接进行矩阵操作,允许使用类似于标量的操作语法(比如可以直接×10 那么数组中每个元素都会×10,或者又可以两个数组相加,则对应位置元素相加)
所以,鉴于for循环太慢,而数组功能强大(当然Dataframe作为Pandas的数据格式,也是完美继承了Numpy数组这个优势的),我们就来借它的优势达到我们的目的。

实现方法:

1> 首先构造用于矩阵运算的表:

(((X1-x2)**2+(y1-y2)**2)**0.5),即这个公式中的x1 x2 y1 y2,构造时要考虑表的shape,应都是1939*1081的(其中表的index为A表的index,column为B表的index),另外表数据在提取时注意维度轴对齐。

python 距离计算出行时间_数组_02


2> 套公式计算距离矩阵:

((X1-x2)**2+(y1-y2)**2)**0.5。这里就是使用了矩阵式运算,对应元素间直接进行操作。ps:①、进行距离计算前,要先把经纬度转换为平面坐标

python 距离计算出行时间_python 距离计算出行时间_03


②、距离矩阵的计算也可以参考博客网址:3、stack操作:

得到距离矩阵后,对表做stack操作,将表index和column降为表的两列(reset_index后),类似于把二维的矩阵拆解为1维的,一个个罗列开来了。

python 距离计算出行时间_距离计算_04


4、merge操作:

stack后出来两列level_0, level_1,分别对应着AB表的index。所以就通过这两列,先分别去和A、B表进行merge,最后再通过level_0和level_1两列共同作为on条件,实现整体信息的最终merge。这样就把距离和对应的表信息都匹配进来了!!!

总结:以前学Numpy的时候,未体会到它的厉害之处,谨以此文记录Numpy矩阵应用之初探。