向量化、Python 中的广播、python _ numpy 向量的说明

2021/7/25 17:07:53

本文主要是介绍向量化、Python 中的广播、python _ numpy 向量的说明,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

1向量化

 

向量化是非常基础的去除代码中 for 循环的艺术,减少运行时间,在python中使用np.dot()进行向量化。

(1)代码举例

import time #为了计算不同方法的使用时间

 

a=np.random.rand(1000000) #用随机值创建了一个百万维度的数组

b=np.random.rand(1000000) #用随机值创建了一个百万维度的数组

 

tic=time.time() #记录当前时间

c=np.dot(a,b) #相当残差函数里面的z=wt+b,做向量化

toc=time.time() #记录运行之后的时间

 

print(c)

print("Vectorized version:"+str(1000*(toc-tic))+"ms")

#非向量化版本

c=0  

tic=time.time() #记录当前时间

for i in range(1000000):  #非向量化的版本

    c +=a[i]*b[i]

toc=time.time() #记录运行之后的时间

 

print(c)

print("For loop:"+str(1000*(toc-tic))+"ms")

运行结果:

 

结果分析:非向量化版本(for循环)花费了很多的时间,大概是向量化版本(np.dot)花费时间的300倍 

2 Python 中的广播(Broadcasting in Python)

这是一个不同食物(每 100g)中不同营养成分的卡路里含量表格,表格为 3 行 4 列,列表示不同的食物种类,从左至右依次为苹果,牛肉,鸡蛋,土豆。行表示不同的营养成分,从上到下依次为碳水化合物,蛋白质,脂肪

 

我们现在想要计算不同食物中不同营养成分中的卡路里百分比,假设上图的表格是一个 3 行 4 列的矩阵A,记为 A3×4,接下来我们要使用 Python 的numpy 库完成这样的计算,在 jupyter notebook 中输入如下代码,按 shift+Enter 运行:

import numpy as np

A=np.array([[56.0,0.0,4.4,68.0],   #定义矩阵A

           [1.2,104.0,52.0,8.0],

           [1.8,135.0,99.0,0.9]])

print(A)

 

cal=A.sum(axis=0) #axis=0表示竖直相加,计算矩阵每列的和,若计算每行,则axis=1

print(cal)

 

percentage=100*A/cal.reshape(1,4) #这时python广播的一个例子,让3*4的一个矩阵A除以这个1*4的矩阵,得到每列中某个数据占这列所有数据之和的百分比,调用 .reshape是为了确定正确的列向量和行向量,重塑操作 reshape 是一个常量时间的操作,时间复杂度是O(1),它的调用代价极低

print(percentage)

 

python中的广播举例说明:

 

3 关于 python _ numpy 向量的说明

Python 的特性允许你使用广播(broadcasting)功能,这是 Python 的 numpy 程序语言库中最灵活的地方,这既是优点也是缺点,优点的原因在于它们创造出语言的表达性,Python 语言巨大的灵活性使得你仅仅通过一行代码就能做很多事情,同时,由于广播巨大的灵活性,有时候你对于广播的特点以及广播的工作原理这些细节不熟悉的话,你可能会产生很细微或者看起来很奇怪的 bug。例如,如果你将一个列向量添加到一个行向量中,你会以为它报出维度不匹配或类型错误之类的错误,但是实际上你会得到一个行向量和列向量的求和。

(1)举例说明

首先设a = np. random. randn(5),这样会生成存储在数组a中的 5 个高斯随机数变量,之后输出a,从屏幕上可以得知,此时 a的 shape(形状)是一个(5, )的结构,这在 Python 中被称作一个一维数组,它既不是一个行向量也不是一个列向量,通常称为值为1的数组

import numpy as np

a=np.random.randn(5) #生成5个随机高斯变量存储在数组a中

print(a)

 

print(a.shape) #查看a的形状,这是Python中秩为1的数组,它即不是行向量也不是列向量

 

print(a.T) #a的转置

print(np.dot(a,a.T)) #求内积 

a=np.random.randn(5,1) #把a设置成5行1列的列向量

print(a)

 

print(a.T) #a的转置是行向量,即1*5的矩阵

 

print(np.dot(a,a.T)) #求内积

 

#写代码时还有一件经常做的事,那就是如果不完全确定一个向量的维度(dimension),可以扔进一个断言语句(assertion statement),像这样,去确保在这种情况下是一个(5,1)向量,或者说是一个列向量:

assert(a.ahape==(5,1)) #声明这是一个5行1列的矩阵

#如果你不小心以一维数组来执行,你也能够重新改变数组维数 a =reshape,表明一个(5,1)数组或者一个(1,5)数组,以致于它表现更像列向量或行向量:

a=a.reshape((5,1)) #把a转换成5*1数组

#还可以使用keepdims,这是一个开关,确保python输出的是一个矩阵:

keepdims=True



这篇关于向量化、Python 中的广播、python _ numpy 向量的说明的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程