Numpy向量化运算

  • 安装方法​​pip install numpy​
  • Numpy是python的开源数值计算库
  1. 数值计算:计算机求数学问题近似解
  2. 科学计算:
  • 符号计算:pi = C/d = 周长/直径
  • 数值计算:pi = 3.1415926
  • Numpy:
  1. Matplotlib/Scipy/Pandas/scikit-learn/Tensorflow等
  2. 可视化、科学计算、数据分析、机器学习、深度学习库的基础库,
  3. 也是Python数据科学的基础

案例,求解下面的y值

  • x1 = [1,2,3,4,5]
  • x2 = [3,5,2,9,10]
  • y =Numpy向量化运算_数值计算
  1. 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)
  1. 使用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)
  • 矢量化运算(向量化运算)
  • 矢量化运算时一种特殊的并行计算方式
  1. 标量计算 --> 串行编程 = 同时只能做一件事,一件接一件
  2. 矢量运算 --> 并行编程 = 同时做所有事
  • 标量运算:省空间,费时间
  • 矢量运算:费空间,省时间

案例:数值模拟-随机漫步

  • 数值模拟
  1. 用计算机模拟自然现象,达到研究现实问题的目的
  • 随机漫步(随机游走,Random Walk):
  1. 布朗运动的数学表达
  • 广泛用于数学/物理/互联网/金融等行业扩散现象的数值模拟
  • 一滴水掉进水里,花粉的布朗运动/金融的价格走势/搜索引擎算法
  • 描述
  1. 从起点开始,随机移动一步
  2. 以移动后的点做起点,重复以上过程

使用随机漫步模拟股票历史价格走势

  • 安装matplotlib插件​​pip install matplotlib​
  1. 一维的随机漫步,类似股票走势
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) # 绘图
  1. 二维的随机漫步
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) # 绘图
  1. 动画展示二维随机漫步
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)
)
  1. 三维随机漫步
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)

Numpy向量化运算_3d_02