码迷,mamicode.com
首页 > 编程语言 > 详细

python学习随笔-向量化

时间:2020-03-30 11:23:35      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:并行   python   return   重复   类型   lock   pytho   四则运算   三元运算符   

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

向量化是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学习随笔-向量化

标签:并行   python   return   重复   类型   lock   pytho   四则运算   三元运算符   

原文地址:https://www.cnblogs.com/wengsy150943/p/12597233.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!