为什么要用向量化操作
例子如下(使用的jupyter运行)
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 / values[i]
return output
# Python循环实现
values= np.random.randint(1,10,size=5)
%timeit compute_reciprocals(values)
输出:
1.9 µs ± 9.23 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
# 向量化操作实现
%timeit 1 / values
输出:
957 ns ± 11.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
可以以看到向量化操作比循环操作要高效的多,且代码量也很少
数组运算
例子如下(使用的jupyter运行)
x = np.arange(-4,1)
print('x =',x)
print('x + 1=',x + 1)
print('x - 1=',x - 1)
print('x * 2=',x * 2)
print('x / 2=',x / 2)
print('x ** 2=',x ** 2)
print('x // 2=',x // 2)
print('x % 2=',x % 2)
print('|x|=',np.abs(x))
输出:
x = [-4 -3 -2 -1 0] x + 1= [-3 -2 -1 0 1] x - 1= [-5 -4 -3 -2 -1] x * 2= [-8 -6 -4 -2 0] x / 2= [-2. -1.5 -1. -0.5 0. ] x ** 2= [16 9 4 1 0] x // 2= [-2 -2 -1 -1 0] x % 2= [0 1 0 1 0] |x|= [4 3 2 1 0]
三角函数
例子如下(使用的jupyter运行,结果因为机器精度问题不是直接等于0)
# 创建一个角度数组
alpha = np.linspace(-np.pi/2,np.pi/2,3)
sin、cos、tan
sin = np.sin(alpha)
cos = np.cos(alpha)
tan = np.tan(alpha)
print('sin(alpha):',sin)
print('cos(alpha):',cos)
print('tan(alpha):',tan)
输出:
sin(alpha): [-1. 0. 1.] cos(alpha): [6.123234e-17 1.000000e+00 6.123234e-17] tan(alpha): [-1.63312394e+16 0.00000000e+00 1.63312394e+16]
arcsin、arccos、arctan
print('arcsin(alpha):',np.arcsin(sin))
print('arccos(alpha):',np.arccos(cos))
print('arctan(alpha):',np.arctan(tan))
输出:
arcsin(alpha): [-1.57079633 0. 1.57079633] arccos(alpha): [1.57079633 0. 1.57079633] arctan(alpha): [-1.57079633 0. 1.57079633]
指数&对数
例子如下(使用的jupyter运行)
x = np.arange(1,4)
print('x = ',x)
print('e^x = ',np.exp(x))
print('2^x = ',np.exp2(x))
print('3^x = ',np.power(3,x))
输出:
x = [1 2 3] e^x = [ 2.71828183 7.3890561 20.08553692] 2^x = [2. 4. 8.] 3^x = [ 3 9 27]
x = [1,np.e,2,4,10]
print('x = ',x)
print('ln(x) = ',np.log(x))
print('log2(x) = ',np.log2(x))
print('log10(x) = ',np.log10(x))
输出:
x = [1, 2.718281828459045, 2, 4, 10] ln(x) = [0. 1. 0.69314718 1.38629436 2.30258509] log2(x) = [0. 1.44269504 1. 2. 3.32192809] log10(x) = [0. 0.43429448 0.30103 0.60205999 1. ]
指定输出(推荐使用,节省内存)
例子如下(使用的jupyter运行)
x = np.arange(5)
y = np.empty(5)
np.multiply(x,10,out=y)
print(x)
print(y)
输出:
[0 1 2 3 4] [ 0. 10. 20. 30. 40.]
注:所有通用函数都可以指定输出,若采用直接赋值的方式赋给y,计算机是开辟个内存空间将值存放起来逐一赋值给y,会消耗计算机内存