-
numpy数组的计算–通用函数:通用函数–numpy为我们提供了一个简单且灵活的接口来优化数据数组的计算
使得numpy变快的关键是利用向量化操作,通常在numpy的通用函数(ufunc)中实现
python处理起某些操作时非常慢的一部分重要原因是该语言的动态性和可解释性-数据类型灵活的特性决定了操作如此缓慢的原因–这时候就出现了一个实时的python编译实现:cpython项目,将python代码转换成可编译的C代码。
python相对缓慢通常出现在很多小操作需要不断重复的时候,比如对数组的每个元素做循环操作时。
IPython的%timeit魔法函数可以被用来测试方法运行时间
例如:
假设有一个数组,如果要计算每个元素的倒数,一种直接的解决方法是
import numpy as np np.random.seed(0) def compute_reciprocals(values): output=np.empty(len(values)) for i in range(len(values)): output[i] = 1.0/values[i] return output values=np.random.randint(1,10,size=5) compute_reciprocals(values) # 这种设计方式很显而易见,但是一般运行较为缓慢,因为在运行时python需要识别其数据类型且需要动态查找可以使用该数据类型的正确函数,而如果我们在编译代码时进行这样的操作,那么就能在代码执行之前知晓声明的类型,从而使得结果的计算更加富有效率
numpy为很多类型的操作提供了非常方便的、静态类型的、可编译程序的接口,也被称作向量操作。
你可以通过简单地对数组执行操作来实现,这里对数组的操作将会被用于数组中的每一个元素。这种向量方法被用于将循环推送至numpy之下的编译层,这样会取得更快的执行效率。
只要你发现python脚本中有循环的出现,都建议用numpy的向量化操作去取代它从而取得更快的运行效率。
具体的提升例子就是:
例如需要计算一个数组中每个元素的倒数
print(1.0/values) #直接用此方法,numpy数组会进行向量化的操作,会比使用下面循环的方式要快的多
print(compute_reciprocals(values))
除了标量和数组的运算,也可以对两个数组进行运算–也可以用于多维数组的运算
例如
np.arange(5)/np.arange(1,6)
x=np.arange(9).reshape((3,3))
-
探索numpy的通用函数
通用函数有两种存在形式:一元通用函数对单个输入操作
二元通用函数对两个输入操作
-
数组的运算
numpy通用函数的使用方式都非常自然,因为它使用的是python原生的算术运算符,标准的加、减、乘、除都可以使用
x=np.arange(4) print("x+5=") print("x//2 =",x//2) #向下整除运算 --,向下取整指当计算的结果不为整数时取小于计算结果的整数.当计算结果为整数时直接取整数
还有就是求负数、**表示的指数运算符和%表示的模运算符的一元通用函数:
-x x**2 x%2
你可以任意将这些算术运算符组合使用。–of course,你需要考虑这些运算符的优先级
需要注意的是,所有的这些算术运算符都是numpy内置函数的简单封装器–例如+运算符就是numpy内置函数add的封装,调用+即为调用np.add(x,2)
下面列出了numpy进行运算符封装所使用的常见内置函数
+ np,add 加法运算 - np.subtract 减法运算 - np.negative 负数运算 * np.multiply 乘法运算 / np.divide 除法运算 // np.floor_divide 向下整除运算(floor division,即3//2=1) ** np.power 指数运算 % np.mod 模/余数 numpy甚至还有布尔/位运算符
-