Numpy向量化运算
原创
©著作权归作者所有:来自51CTO博客作者带着梦想飞翔的原创作品,请联系作者获取转载授权,否则将追究法律责任
Numpy向量化运算
- 安装方法
pip install numpy
- Numpy是python的开源数值计算库
- 数值计算:计算机求数学问题近似解
- 科学计算:
- 符号计算:pi = C/d = 周长/直径
- 数值计算:pi = 3.1415926
- Matplotlib/Scipy/Pandas/scikit-learn/Tensorflow等
- 可视化、科学计算、数据分析、机器学习、深度学习库的基础库,
- 也是Python数据科学的基础
案例,求解下面的y值
- x1 = [1,2,3,4,5]
- x2 = [3,5,2,9,10]
- y =
- python计算方式
x1 = [1,2,3,4,5]
x2 = [3,5,2,9,10]
y = []
for xx,yy in zip(x1,x2):
y.append(xx**2 + yy**3)
print(y)
- 使用Numpy的向量化运行
import numpy
x1 = numpy.array([1,2,3,4,5])
x2 = numpy.array([3,5,2,9,10])
y = x1**2 + x2**3
print(y)
- 上面计算中,无法直接看出两者的差距,可以看下面代码:
import numpy
import datetime
k = 2222222
m = 3333333
x1 = [1,2,3,4,5]
x2 = [3,5,2,9,10]
y3 = []
dt1 = datetime.datetime.now()
for xx,yy in zip(x1,x2):
y3.append(xx**k+yy**m)
dat2 = (datetime.datetime.now() -dt1).total_seconds()
print("普通计算时间:",dat2)
print("- "* 30)
x1 = numpy.array([1,2,3,4,5])
x2 = numpy.array([3,5,2,9,10])
dat3 = datetime.datetime.now()
y = x1**k + x2**m
print(y)
dat4 = (datetime.datetime.now() - dat3).total_seconds()
print("numpy计算时间:",dat4)
- 矢量化运算(向量化运算)
- 矢量化运算时一种特殊的并行计算方式
- 标量计算 --> 串行编程 = 同时只能做一件事,一件接一件
- 矢量运算 --> 并行编程 = 同时做所有事
案例:数值模拟-随机漫步
- 用计算机模拟自然现象,达到研究现实问题的目的
- 布朗运动的数学表达
- 广泛用于数学/物理/互联网/金融等行业扩散现象的数值模拟
- 一滴水掉进水里,花粉的布朗运动/金融的价格走势/搜索引擎算法
- 从起点开始,随机移动一步
- 以移动后的点做起点,重复以上过程
使用随机漫步模拟股票历史价格走势
- 安装matplotlib插件
pip install matplotlib
- 一维的随机漫步,类似股票走势
import numpy
from matplotlib import pyplot
# 随机生成0和1的数字,生成100000个
stock = numpy.random.randint(0,2,100000)
# 替換stock中的數字如果出现0就替换成-1,否则替换成1
stock2 = numpy.where(stock==0,-1,1)
# 累加,计算,本次移动的起点是上次移动的终点
stock_sum = stock2.cumsum()
print(stock[0:100])
print(stock_sum[0:100])
pyplot.figure(figsize = (18,12)) #设置图片大小
pyplot.plot(stock_sum) # 绘图
- 二维的随机漫步
import numpy
from matplotlib import pyplot
# 随机生成0和1的数字,生成100000个
max = 100000
x = numpy.random.randint(0,2,max)
y = numpy.random.randint(0,2,max)
# 修改步长,0转为-1。替換stock中的數字如果出现0就替换成-1,否则替换成1
xx = numpy.where(x==0,-1,1)
yy = numpy.where(y==0,-1,1)
# 累加,计算,本次移动的起点是上次移动的终点
xsum = xx.cumsum()
ysum = yy.cumsum()
pyplot.figure(figsize = (18,15),dpi=300) #设置图片大小
pyplot.plot(xsum,ysum) # 绘图
- 动画展示二维随机漫步
import numpy
from matplotlib import pyplot
from matplotlib.animation import FuncAnimation #载入动画子库
# 随机生成0和1的数字,生成100000个
max = 100000
x = numpy.random.randint(0,2,max)
y = numpy.random.randint(0,2,max)
# 修改步长,0转为-1。替換stock中的數字如果出现0就替换成-1,否则替换成1
xx = numpy.where(x==0,-1,1)
yy = numpy.where(y==0,-1,1)
# 累加,计算,本次移动的起点是上次移动的终点
xsum = xx.cumsum()
ysum = yy.cumsum()
# pyplot.figure(figsize = (18,15),dpi=300) #设置图片大小
# pyplot.plot(xsum,ysum) # 绘图
# 动画画图
%matplotlib notebook
# 构建画板
fig,ax = pyplot.subplots()
#动画每帧要调用的函数
def update(i):
pyplot.title(i)
pyplot.plot(
xsum[i-2:i],
ysum[i-2:i],
alpha=0.5, #透明度
)
ani = FuncAnimation(
fig, #动画应用的图像
update,#动画每帧要调用的函数
interval = 1, #动画帧间隔,毫秒
frames = len(xsum), #动画帧数,对GIF有效,值调用函数内的i可以获取。可自定义值如range(50,100)
)
- 三维随机漫步
import numpy
from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D #載入三维字库
%matplotlib notebook
def getPoint(n=100000):
x = numpy.where(numpy.random.randint(0,2,n)==0,-1,1).cumsum()
y = numpy.where(numpy.random.randint(0,2,n)==0,-1,1).cumsum()
z = numpy.where(numpy.random.randint(0,2,n)==0,-1,1).cumsum()
return x,y,z
x,y,z = getPoint(600)
#构建三维坐标系
fig = pyplot.figure()
ax = Axes3D(fig)
#绘图
ax.plot(x,y,z)
#设置点的颜色
ax.scatter(x,y,z,color='r',s=20,alpha=0.3)
扩展,随机数的散点图
import numpy
from matplotlib import pyplot
import random
count = 80000
x = numpy.random.rand(count)
y = numpy.random.rand(count)
# x = numpy.array([random.random() for _ in range(count)])
# y = numpy.array([random.random() for _ in range(count)])
pyplot.figure(figsize=(18,8))
pyplot.scatter(x,y,s=0.5)