向量化、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 向量的说明的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25Python编程基础:变量与类型
- 2024-11-25Python编程基础与实践
- 2024-11-24Python编程基础详解
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器