python学习随笔-向量化

Posted 凤涅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习随笔-向量化相关的知识,希望对你有一定的参考价值。

本文只是在学习过程中框架的简记和遇到问题的整理,必然不全面和存在错漏

向量化是python的一种魔法加速操作,可以在一定程度上加速python运算,主要依托numpy库和数组的运算。目前看到的原理解释有两种,一种是numpy库的底层是cpp的,所以比较快,一种是向量化会使python并行运算的程度加快。这两种在某种程度上可能是相关的。

我接触向量化的动机是python作业要用线性变换的方法逐像素旋转图像,跑得实在太慢,所以想用向量化加速一下。结果一波优化下来,去掉一层循环大概快了1/3,与一般介绍向量化的例子相比优化速度并没有很多想要进一步压缩,再去掉一层循环之后耗时反而上升了。怀疑是优化的部分里面计算的部分耗时不是很多,剩下的可能是访问内存的时间(纯口胡)。

for i in range(len(img)):
        xi=(cos_theta*(i-center_i)+sin_theta*(width-center_j)+center_i)#width是一个存储range(len(img[0]))的数组
        xi=xi.astype(‘int‘)
        xj=(cos_theta*(width-center_j)-sin_theta*(i-center_i)+center_j)
        xj=xj.astype(‘int‘)
        for j in width:#这部分因为涉及数组寻址,不会优化,只好放着
            if (xi[j]>=0) & (xj[j]>=0) & (xi[j]<len(img)) & (xj[j]<len(img[0])):
                imgR[i][j] = img[xi[j]][xj[j]]
    return imgR

下面来具体总结一下遇到的向量化的操作。

向量化的目标是尽量地减少循环,尤其是在运算很多的时候,换言之,就是要把实现重复运算的循环变成向量的形式一口气做完。

基本运算

使用np.array将想要运算的内容转成数组运算。

基本四则运算和普通的变量相同。

if语句使用np.where替代,语法是np.where(cond,trueValue,falseValue),用法以及三个变量的顺序和cpp的三元运算符完全一致,其中逻辑判断式不支持and/or等逻辑运算,但可以用cpp风格的位运算替代。

不支持使用类似int(parameter)的形式进行类型转换,需要的话请用parameter.astype(int)

矩阵运算

这里的矩阵运算作用的元素依然是上面的数组类型,如果是使用mat可能会有所不同?

在python中,矩阵间的*依然会被识别为普通的向量乘法,也即对应位置相乘,需要矩阵相乘请使用np.dot(A,B)注意乘法的顺序

扩充数组元素,有repeattile两种,前者是对每一个元素复制之后放在它后面,后者是把整个数组按要求复制,以下是官方样例

>>> from numpy import *
>>> repeat(7.,4)
array([ 7.,  7.,  7.,  7.])
>>> a=array([10,20])
>>> a.repeat([3,2])#这两个参数对应元素的复制次数
array([10, 10, 10, 20, 20])
>>> repeat(a,[3,2])
array([10, 10, 10, 20, 20])
>>> a=array([[10,20],[30,40]])
>>> a.repeat([3,2],axis=0)#axis=0表示对列这个维度操作
array([[10, 20],
       [10, 20],
       [10, 20],
       [30, 40],
       [30, 40]])
>>> a.repeat([3,2],axis=1)#默认是axis=1,也就是对行操作
array([[10, 10, 10, 20, 20],
       [30, 30, 30, 40, 40]])
>>> from numpy import *
>>> a=array([10,20])
>>> tile(a,(3,2)) #把原数组视为一个子矩阵,以之为元素构造3X2的矩阵
array([[10, 20, 10, 20],
       [10, 20, 10, 20],
       [10, 20, 10, 20]])
>>> tile(42.0,(3,2))
array([[ 42.,  42.],
       [ 42.,  42.],
       [ 42.,  42.]])

矩阵的转置使用np.transpose,似乎mat支持直接a.T

以上是关于python学习随笔-向量化的主要内容,如果未能解决你的问题,请参考以下文章

如何向量化强化学习环境?

吴恩达深度学习:2.11向量化

如何矢量化这个 python 代码?

Python 向 Postman 请求代码片段

吴恩达机器学习_43矢量

带有时间序列的python递归向量化