numpy的meshgrid基于向量生成网格矩阵的用法详解

你在这里

numpy的meshgrid基于向量生成网格矩阵的用法详解

numpy.meshgrid()函数是python矢量化的重要手段。所谓矢量化,是通过矩阵运算替换循环,从而将运算速度提高1至2个数量级的方法。
例如:
对x = [1,2,3],y = [4,5],求解每一个x和y组合的sqrt(x^2+y^2)。
方法一:
这个题目也就是要计算每一个x,y组合的平方和开根号,此时可以用下面的循环来做:
x=[1,2,3]
y=[4,5]
z=[]
for i in x:
    for j in y:
        z.extend([sqrt(i**2+j**2)])
得到的结果z为:
[4.1231056256176606,
 5.0990195135927845,
 4.4721359549995796,
 5.3851648071345037,
 5.0,
 5.8309518948453007]
方法二:
如果使用numpy.meshgrid,则其实现为:
x=[1,2,3]
y=[4,5]
xs,ys=np.meshgrid(x,y)
z=np.sqrt(xs**2+ys**2)
得到的结果z为:
array([
[ 4.12310563, 4.47213595, 5. ],
[ 5.09901951, 5.38516481, 5.83095189]
])
具体的meshgrid做的事情是什么呢?xs,ys=np.meshgrid(x,y)时,生成了两个二位网格矩阵,查看numpy官网文档,其解释为:
numpy.meshgrid(*xi, **kwargs) Return coordinate matrices from coordinate vectors.翻译为基于坐标向量返回坐标矩阵。实际运行的结果
xs=array([
[1, 2, 3],
[1, 2, 3]])
ys=array([
[4, 4, 4],
[5, 5, 5]])
生成这样的矩阵后,就可以使用numpy的矩阵运算,包括矩阵算数运算:平方**2,二元加法运算+,一元函数运算sqrt()。
当向量比较小的时候无法看出其性能的差异,但当其设置为如下上千个值的计算时,性能的差异就显著体现出来。如:
x=arange(-5,5,0.01)
y=arange(6,10,0.01)
则用%time查看执行时间的结果如下:
方法一:CPU times: user 0.97 s, sys: 0.00 s, total: 0.97 s   Wall time: 0.97 s
方法二:CPU times: user 0.01 s, sys: 0.00 s, total: 0.01 s   Wall time: 0.01 s
总结:

矢量化是提高代码性能的重要方法,numpy的meshgrid函数给我们提供了矢量化计算的基础,是一个在大数据统计分析中不可或缺的方法。

 
著作权归作者所有。商业转载请联系本站作者获得授权,非商业转载请注明出处 ZZKOOK

您可能感兴趣的文章

登录以发表评论

评论

很有用,谢谢。

 
157
MR的头像

都是命

 
128
随心随意的头像

正要起步,感谢分享。

 
136
菜菜的头像

三克油!

 
166
rainbow的头像

知识共享,善莫大焉

 
138
Cay的头像