Numpy模块的基础操作-学习笔记

2021-08-09 11:12:34 浏览数 (1)

作者:孙湛林

来源:快学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)

0 人点赞