Numpy是Python很多科学计算与工程库的基础库,在量化数据分析中最常使用的pandas也是基于Numpy的封装,可以说Numpy就是量化数据分析领域中的基础数组,学会Numpy是量化分析中关键的一步。
Numpy的输出是一个非常大且连续的并由同类型数据组成的内存区域,所以可以构造一个比普通列表大得多的数组,并且灵活高效地对数组中所有的元素进行并行化操作。
一、并行化思想
示例1:构建10000个元素的普通列表循环求每个元素的平方,使用IPython Notebook的 %timeit 比较其与numpy.arrage()构建列表的运行效率。
代码块1:使用python自带的range()构建
normal_list = range(10000)
%timeit [i**2 for i in normal_list]
# 3.39 ms ± 73.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
代码块2:使用numpy.arange()构建
import numpy as np
np_list = np.arange(10000)
%timeit np_list**2
# 7.57 µs ± 42.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
比较结果:可以很直观地看出运行效率的提升,Numpy数组和普通列表的操作方式不同之处在于:Numpy通过广播机制作用于每一个内部元素,是一种并行化执行的思想,而普通list则作用于整体。
示例2:观察*3分别作用在普通列表与Numpy数组的区别。
代码块1:*3 操作被运作在Numpy数组的每一个元素上
np_list = np.ones(5) * 3
print(np_list)
# [3. 3. 3. 3. 3.]
代码块2:*3 操作认为是整体性操作
normal_list = [1, 1, 1, 1, 1] * 3
print(normal_list)
# [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
二、初始化操作
常用的初始化np array的方式:
# 100个0
np.zeros(100)
# shape: 3行2列 全是0
np.zeros((3,2))
# shape: 3行2列 全是1
np.ones((3,2))
# shape: x=2, y=3, z=3 值随机
np.empty((2, 3, 3))
# 初始化序列与np_list一样的shape,值全是1
np.ones_like(np_list)
# 初始化序列与np_list一样的shape,值全是0
np.zeros_like(np_list)
# eye()得到对角线全是1的单位矩阵
np.eye(3)
print(np.eye(3))
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
也可以将普通list作为参数,通过np.array来初始化np array:
data = [[1,2,3,4],[5,6,7,8]]
arr_np = np.array(data)
arr_np
#