Numpy基础(通用函数)
通用函数
Numpy提供了两种基本的对象,即ndarray和ufunc对象。前文已经介绍了ndarray,本
节将介绍Numpy的另一个对象通用函数(ufunc)。ufunc是universal function的缩写,它是
一种能对数组的每个元素进行操作的函数。许多ufunc函数都是用C语言级别实现的,因此
它们的计算速度非常快。此外,它们比math模块中的函数更灵活。math模块的输入一般是
标量,但Numpy中的函数可以是向量或矩阵,而利用向量或矩阵可以避免使用循环语句,
这点在机器学习、深度学习中非常重要。表1-5为Numpy中常用的几个通用函数。
函数 | 使用方法 |
---|---|
sqrt | 计算序列化数据的平方根 |
sin,cos | 三角函数 |
abs | 计算序列化数据的绝对值 |
dot | 矩阵运算 |
log,log10,log2 | 对数函数 |
exp | 指数函数 |
cumsum,cumproduct | 累计求和、求积 |
sum | 对一个序列化数据进行求和 |
mean | 计算均值 |
median | 计算中位数 |
std | 计算标谁差 |
var | 计数方差 |
corrcoef | 计算相关系数 |
1.math与numpy函数的性能比较
import time
import math
import numpy as np# 修复:使用 time.perf_counter() 替代已移除的 time.clock()
x = [i * 0.001 for i in np.arange(1000000)]start = time.perf_counter() # 修正点1
for i, t in enumerate(x):x[i] = math.sin(t)
print("math.sin:", time.perf_counter() - start) # 修正点2x = np.array([i * 0.001 for i in np.arange(1000000)]) # 优化:直接生成数组start = time.perf_counter() # 修正点3
np.sin(x) # 向量化计算
print("numpy.sin:", time.perf_counter() - start) # 修正点4
运行结果
math.sin: 0.26994549995288253
numpy.sin: 0.011595400050282478
由此可见,numpy.sin比math.sin快近10倍。
2.循环与向量运算比较
充分使用Python的Numpy库中的内建函数(Built-in Function),来实现计算的向量
化,可大大地提高运行速度。Numpy库中的内建函数使用了SIMD指令。如下使用的向量
化要比使用循环计算速度快得多。如果使用GPU,其性能将更强大,不过Numpy不支持
GPU。PyTorch支持GPU,后面第5章将介绍PyTorch如何使用GPU来加速算法。
import time
import numpy as npx1=np.random.rand(1000000)
x2=np.random.rand(1000000)
##使用循环计算向量点积
tic=time.process_time()
dot=0
for i in range(len(x1)):dot+=x1[i]*x2[i]
toc=time.process_time()
print("dot = "+str(dot)+"\nfor loop ------ Computation time=" +str(1000*(toc-tic))+"ms")
##使用numpy函数求点积
tic=time.process_time()
dot=0
dot=np.dot(x1,x2)
toc=time.process_time()
print("dot ="+str(dot)+"\n vertor version ----- Computation time=" +str(1000*(toc-tic))+"ms")
运行结果
dot = 250103.418572677
for loop ------ Computation time=546.875ms
dot =250103.4185726741vertor version ----- Computation time=31.25ms
从运行结果上来看,使用for循环的运行时间大约是向量运算的400倍。因此,在深度
学习算法中,一般都使用向量化矩阵进行运算。