作者:孙湛林
来源:快学Python
基于python的金融分析与风险管理,关于numpy的基础操作梳理~
一、N维数组
数组是numpy中最常见的数据结构,np.array() 。字符串和数字不能同时存在于同一个数组中。
1. 数组的结构
代码语言:javascript复制weight = np.array([0.15, 0.2, 0.25, 0.4]) #直接输入数组
# 将列表转化为数组
weight_list = [0.15, -.2, 0.25, 0.4]
weight_array = np.array(weight_list)
- reshape 和 ravel 转换数组维度
代码语言:javascript复制# 列表转化为一维数组,reshape成4*5的数组
return_list = [0.003731, 0.021066, -0.004854, 0.006098, -0.00606, -0.001838, 0.001842, -0.016544, -0.003738, 0.003752, -0.003087, -0.000344, -0.033391, 0.007123, 0.004597, -0.024112, 0.011704, -0.029563, -0.01457, 0.016129]
return_array = np.array(return_list)
return_array = return_array.reshape(4,5) #4行 5列
# 用ravel回到一维数组
return_array.ravel()
- 查看数组的属性
代码语言:javascript复制return_array.ndim #查看数组维度
return_array.size #查看数组的元素数量
return_array.dtype #查看数组的元素类型
2. 数组的便捷生成
- 生成整数数组
代码语言:javascript复制a = np.arange(0,10)
b = np.arange(0,100,3) #0开始到100,每隔3取一个数
- 生成等差数组
第一个参数是起始值,第二个参数是终止值(默认包含在内),第三个参数是数组中元素个数。注意和arange区别。
代码语言:javascript复制np.linspace(0,100,51)
- 创建元素0 的数组(元素1 同理)
代码语言:javascript复制np.zeros(4) #一维 4个0
np.zeros((4,5)) # 4行 5列的0
zero_weight = np.zeros_like(weight_array) #生成一个和目标一样维度,但数据都是0 的array
----------------------------
np.ones(5)
np.ones((5,6))
np.ones_like(return_array)
- 创建单位矩阵
对角线=1,其他位置=0
代码语言:javascript复制np.eye(5) #数组就是二维的
二、数组的索引、切片、排序
1. 索引
代码语言:javascript复制return_array[1,2] #找1行 2列的数据
np.where(return_array<-0.01) #按照一定规则找值
说明:where返回的元祖,第一个元素是满足条件元素的行,第二个元素是满足条件元素的列。即< - 0.01的元素是,1行2列,2行2列,3行0列,3行2列,3行3列。
2. 切片
代码语言:javascript复制return_array[2:, 1:4] #第三行以后的数据,第二列到第三列。左闭右开
return_array[1] # 第二行
return_array[:,2] # 第三列
3. 排序
代码语言:javascript复制np.sort(return_array) # 默认axis=1.一行从左到右,从小到大
np.sort(return_array, axis=0) #从上往下,从小到大
说明:排序的时候,行和行之间就不再有对应关系了。
三、数组的相关运算
1. 数组内的运算
- 求和
代码语言:javascript复制return_array.sum(axis=1) #按行求和,返回的也是数组
return_array.sum(axis=0) #按列求和
return_array.sum() #全部元素的和
- 求乘积,axis原理一致
代码语言:javascript复制return_array.prod(axis=1) #求行乘积
- 求最值,axis原理一致
代码语言:javascript复制return_array.min() # 全部数据的最小值
return_array.max(axis=0) # 按列求最大值
- 求均值,axis原理一致
代码语言:javascript复制return_array.mean() # 求全部元素平均值
- 求方差标准差,axis原理一致
代码语言:javascript复制return_array.var() # 求方差
return_array.std() # 求标准差
- 幂运算
代码语言:javascript复制np.sqrt(return_array) #每个元素的开方
np.square(return_array) #每个元素的平方
np.exp(return_array) #每个位置 = e的 该位置元素 的次方
- 对数运算
代码语言:javascript复制np.log(return_array) #每个元素计算自然对数
np.log10(return_array) #每个元素以10为底的对数
np.log2(return_array) #以2为底
2. 数组间的运算
数组间的运算包括加减乘除 幂次方,运算适用于有相同行数、列数的数组。
代码语言:javascript复制return_array one_return
# 一个数字与数组的运算
return_array 10 #数组每个元素 10
return_array ** 2 #数组每个元素 平方
- 比较后保留最大、最小值
两个或多个相同形状的数组之间,对应位置元素大小关系比较后,保留大 / 小的元素,形成新数组
代码语言:javascript复制np.maximum(zero_return, return_array) #保留大的元素
return_min = np.minimum(return_array, zero_return)
3. 矩阵的操作
- 矩阵的性质
代码语言:javascript复制corrcof_return = np.corrcoef(return_array) #求得相关系数矩阵
其他的形式:np.diag()对角线;np.triu 矩阵上三角;np.tril 矩阵下三角;np.trace 矩阵的迹;T 转置。
- 矩阵的运算
内积、矩阵的行列式、逆矩阵、特征值分解、奇异值分解【P74】
代码语言:javascript复制np.dot(weight_array, return_array) #内积
说明:dot函数的原理是,左侧第一行 * 右侧第一列;左侧第一行 * 右侧第二列;所得的结果相加形成一个值 以此类推,将全部元素一次乘完。数组的行列要能一一对应才行。
子模块linalg的主要函数
四、numpy生成随机数
1. 主要的统计分布
二项分布、几何分布、超几何分布、泊松分布、均匀分布、正态分布、对数正态分布、卡方分布、学生 t 分布、F 分布、贝塔分布、伽玛分布和指数分布
2.部分统计分布示例
代码语言:javascript复制import numpy.random as npr
# 从均值=1,标准差=2的正态分布中取随机数,取10000次。
# 把数形成一维array,赋值给x_norm
x_norm = npr.normal(loc=1, scale=2, size=10000)
# 标准正态分布取数,有三种方法
x_snorm1 = npr.randn(10000)
x_snorm2 = npr.standard_normal(size=10000)
x_snorm3 = npr.normal(loc=0, scale=1, size=10000)
# 对数服从均值=0.5,标准差=1的正态分布,取数10000次
x_logn= npr.lognormal(mean=0.5, sigma=1.0, size=10000)
# 从自由度=4的卡方分布中取数
x_chi1 = npr.chisquare(df=4, size=10000)