标签:并行 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)
,注意乘法的顺序
扩充数组元素,有repeat
和tile
两种,前者是对每一个元素复制之后放在它后面,后者是把整个数组按要求复制,以下是官方样例
>>> 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 return 重复 类型 lock pytho 四则运算 三元运算符
原文地址:https://www.cnblogs.com/wengsy150943/p/12597233.html