大家好,今天我用图解的方式讲解Numpy的用法,内容较长建议收藏,梳理不易,点赞支持。
整理不易,关注一下吧ღ( ´・ᴗ・` )比心🤔
一丶Numpy常用函数介绍(1)–工具安装及Numpy介绍
1.NumPy(Numerical Python)
NumPy是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,也针对数组运算提供大量的数学函数库。NumPy 为开放源代码并且由许多协作者共同维护开发,是一个运行速度非常快的数学库,用于数组计算。
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用,可广泛用于替代 MatLab,是一个强大的科学计算环境,便于后期学习数据科学和者机器学习。 SciPy 是一个开源的 Python 算法库和数学工具包, 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面,是为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API),前期在数据可视化中做作过简单的介绍。
1、numpy中的数组操作及代码
NumPy中的ndarray是一个多维数组对象,该对象由两部分组成:实际的数据和描述这些数据的元数据,大部分的数组操作仅仅修改元数据部分。
import numpy as np #导入numpy包,并另命令为np
a = np.arange(5) # 调用numpy中的函数arange,函数创建数组
print(a.dtype) # 打印出数组a的数据类型
print(a.shape) #数组的 shape 属性返回一个元组(tuple),元组中的元素即为NumPy数组每一个维度上的大小
print('\n')
#创建多维数组
m = np.array([np.arange(5), np.arange(5)]) #列表作为参数传给array函数,从而创建了一个5×2的数组
print(m)
#选取数组元素
print(m[0,0])
print(m[0,1])
print(m[1,1])
print(m[1,2])
print(m[1,3])
# NumPy 自定义的异构数据类型,该数据类型包括一个用字符串记录的名字、一个用
# 整数记录的数字以及一个用浮点数记录的价格
t = np.dtype([('name', np.str_, 40), ('numitems', np.int32), ('price',np.float32)])
print(t)
# 一维数组的索引和切片
a = np.arange(9)
print(a[3:7])
print('\n')
#多维数组的切片和索引
b = np.arange(24).reshape(2,3,4) #reshape函数的作用是改变数组的“形状”,也就是改变数组的维度
#其参数为一个正整数元组,分别指定数组在每个维度上的大小
print(b.shape)
print('\n')
print(b)
print('\n')
print(b[0])
print('\n')
print(b[:,0,0]) #下标用英文标点的冒号:来代替,表示不限该位置的参数,即打印出b的第1行,第1列的所有元组的数据。
运行结果如下: 至于具体更详细的用法,可以多试试。
2.numpy改变数组的维度
上述的reshape函数可以将一维数组[0,1,2,…,23]转变为具有2个元素,每个元素是一个二维数组的三维数组,同样,也可以将多维数组转变为一维数组(将数组展平)。
可以用 ravel 等函数完成相关操作,见如下代码:
import numpy as np #导入numpy包,并另命令为np
c = np.array([ #先定义一个numpy的多维数组
[[0,1,2,3],[4,5,6,7],[8,9,10,11]],
[[12,13, 14,15],[16,17,18,19],[20,21,22,23]]
])
e=d=c
print (c.ravel())
print('\n')
print(c.flatten())
print('\n')
#用元组设置维度
d.shape = (6,4)
print(d)
print('\n')
# transpose用于转置,即行列互换,即线性代数中的转置矩阵
print(e.transpose())
运行结果:
3.数组的组合
NumPy数组有水平组合、垂直组合和深度组合等多种组合方式,使用 vstack 、dstack 、 hstack 、 column_stack 、 row_stack 以及 concatenate 等函数来完成数组的组合。
import numpy as np #导入numpy包,并另命令为np
a = np.arange(9).reshape(3,3)#定义a为3行3列的二维数组
b=2*a #定义b,且b的每个元素均为a的两倍。
print(a) #打印出a数列
print('\n')
print(b) #打印出b数列print('\n')
运行结果: 分别看一下组合后的运行结果,代码如下:
import numpy as np #导入numpy包,并另命令为np
a = np.arange(9).reshape(3,3) #定义a为3行3列的二维数组
b=2*a #定义b,且b的每个元素均为a的两倍,数组结构与a一致。
#水平组合:将ndarray对象构成的元组作为参数,传给hstack 函数
print(np.hstack((a, b))) #水平组合
print('\n')
print(np.concatenate((a, b), axis=1)) #注意axis参数
print('\n')
#垂直组合
print(np.vstack((a, b)))
print('\n')
print(np.concatenate((a, b), axis=0))#注意axis=0是默认值,即可以不设置。
print('\n')
运行结果如下: 很明显,上述函数np.hstack((a,b))的结果显示为将a的行与b的行连成一个更长的行(np.concatenate()函数一样,只是多了一个参数),相当于增加了数组的列数。
而np.vstack((a,b)),则是结合成具有更多的行,而列数不变。用二维表示如下:
接下来看一下深度组合、列组合、行组合
import numpy as np #导入numpy包,并另命令为np
a = np.arange(9).reshape(3,3) #定义a为3行3列的二维数组
b=2*a #定义b,且b的每个元素均为a的两倍,数组结构与a一致。
#深度组合 将相同的元组作为参数传给 dstack
print(np.dstack((a, b)))
print('\n')
#列组合
print(np.column_stack((a, b)))#对于二维数组,column_stack 与hstack的效果是相同
print('\n')
# 行组合
print(np.row_stack((a,b)))#对于二维数组,column_stack与vstack 的效果是相同
从上可以看出,深度组合,就是将一系列数组沿着纵轴(深度)方向进行层叠组合,比如这里只有2个数组a和b,所以深度只有2,由于a和b都是3*3,就形成如下结果:
二维数组中,行组合和列组合与水平组合、垂直组合一样,不作过多介绍。
4.数组的分割
数组能组合 ,当然也能分割成多个子数组。像组合一样,也可分为水平分割、垂直分割、深度分割。
1、水平分割 和垂直分割
import numpy as np #导入numpy包,并另命令为np
a = np.array([[0, 1, 2],[3, 4, 5],[6, 7, 8]]) #定义一个多维数组
#水平分割
print(np.hsplit(a,3)) #hsplit把数组沿着水平方向分割为3个相同大小的子数组
# 或者
print(np.split(a,3,axis=1)) #同hsplit
#垂直分割
print(np.vsplit(a,3)) #vsplit把数组沿着垂直方向分割为3个相同大小的子数组
# 或者
print(np.split(a,3,axis=0)) #同vsplit,注意参数
运行结果: 整理后,得到:[array([[0],[3],[6]]), array([[1], [4],[7]]), array([[2],[5],[8]])]也就是将0,3,6归为一组,注意:都是分别用"[ ]“和”,"分开的。
2、深度分割
import numpy as np #导入numpy包,并另命令为np
c = np.array(np.arange(27).reshape(3, 3, 3)) #创建一个多维数组,并设置
print(np.dsplit(c,3))
运行结果如下
[array([[[ 0],[ 3],[ 6]],[[ 9],[12],[15]],[[18],[21],[24]]]),
array([[[ 1],[ 4],[ 7]],[[10],[13],[16]],[[19],[22],[25]]]),
array([[[ 2],[ 5],[ 8]],[[11],[14],[17]],[[20],[23],[26]]])
]
生成的C数组为 : 这三块数据应该像纸张一样叠加的,0,3,6的下一层对应的是9,12,15,再下一层是18,21,24。
5.Numpy数组的其他属性
在开始的代码中有 .dtype和 .shape分别是数组的两个不同的属性,除此之外,还有其他属性,如下:
import numpy as np #导入numpy包,并另命令为np
a = np.array([[0, 1, 2],[3, 4, 5],[6, 7, 8]]) #定义一个多维数组
print(a.dtype) #数组a的数据类型
print(a.shape) #数组a的维数
print(a.ndim) #给出数组的维数,或数组轴的个数
print(a.size) #给出数组元素的总个数
print(a.itemsize) #元素在内存中所占的字节数
print(a.nbytes) #元素在内存中所占的存储空间,itemsize和size属性值的乘积
#复数的表示
b = np.array([1.j + 1, 2.j + 3])
print(b.real)#打印实数
print(b.imag)#打印虚数部分
c = np.arange(4).reshape(2,2)
print(c)
f = c.flat #flat属性,可以像遍历一维数组一样去遍历任意的多维数组
for item in f :
print(item)
#或者获取多个元素
print( c.flat[[1,3]])
#flat 属性是一个可赋值的属性。对flat属性赋值将导致整个数组的元素都被覆盖
c.flat=5 # 对flat属性赋值将导致整个数组的元素都被覆盖
print(c)
b = np.array([1.j + 1, 2.j + 3]) # 数组的转换
print( b.tolist())
print( b.astype(int)) #astype 函数可以在转换数组时指定数据类型int
运行结果如下: 小结:
上述列举了许多有关NumPy的基础知识:数据类型和NumPy数组。类似于Python列表,NumPy数组也可以方便地进行切片和索引操作。但在多维数组上,NumPy有明显的优势。
对涉及改变数组维度的操作有很多种——组合、调整、设置维度和分割等,列举了实用函数进行了说明。
二丶 Numpy常用函数介绍
摘要:本篇我们将以分析历史股价为例,介绍怎样从文件中载入数据,以及怎样使用NumPy的基本数学和统计分析函数、学习读写文件的方法,并尝试函数式编程和NumPy线性代数运算,来学习NumPy的常用函数。
1.文件读入 :读写文件是数据分析的一项基本技能
CSV(Comma-Separated Value,逗号分隔值)格式是一种常见的文件格式。通常,数据库的转存文件就是CSV格式的,文件中的各个字段对应于数据库表中的列。
NumPy中的 loadtxt 函数可以方便地读取CSV文件,自动切分字段,并将数据载入NumPy数组。
1、保存或创建新文件
import numpy as np
i = np.eye(3) #eye(n)函数创建n维单位矩阵
print(i)
np.savetxt('test.txt', i) #savetxt()创建并保存test.txt文件
savetxt()
函数,如果有已经文件则更新,如目录中没有,则创建并保存test.txt文件
运行结果如下:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
2、读取csv文件的函数loadtxt
1)先在保存程序的目录下创建一个名称为data.csv的文件,并设置数据如下图:
2)读取文件,如下:
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
usecols 的参数是一个元组,以获取第7字段至第8字段的数据,也就是上述文件中 股票的收盘价和成交量数据。 unpack 参数设置为 True ,是分拆存储不同列的数据,即分别将收盘价和成交量的数组赋值给变量c和v。
3、常见的函数
成交量加权平均、时间加权、算术平均值、中位数、方差等
import numpy as np
i = np.eye(3) #eye(n)函数创建n维单位矩阵
print(i)
np.savetxt('test.txt', i) #savetxt创建并保存test.txt文件
#读取csv文件
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
"""usecols 的参数为一个元组,以获取第7字段至第8字段的数据,也就是股票的收盘价和成交量数据。 unpack 参数设置为 True ,是分拆存储不同列的数据,即分别将收
盘价和成交量的数组赋值给变量c和v"""
vwap = np.average(c, weights=v) #调用了average函数,将v作为权重参数使用,
print(vwap)
print('\n')
print( np.mean(c)) #算术平均值
print('\n')
t = np.arange(len(c))
print( t )
print('\n')
twap =np.average(c, weights=t) #按时间权重
print( twap )
print('\n')
h,l=np.loadtxt('data.csv',delimiter=',', usecols=(4,5), unpack=True)
# 获取第4字段至第5字段的数据,即股票的最高价和最低价
print ( np.max(h)) #获取最大值max()
print ( np.min(l)) #获取最小值min()
print('\n')
print( np.ptp(h) ) # 用ptp()函数计算了极差,即最大值和最小值之间的差值
print( np.ptp(l) )
print('\n')
print( np.median(c)) # 中位数median()函数,即多个数据中,处于中间的数
print( np.msort(c))#msort(( ))函数对价格数组进行排序,可以验证上述中位数
#方差的计算
variance = np.var(c) #方差函数var()
print(variance)
用代码、excel进行相关计算,运行结果如下: 为后面计算,将data.csv中的数据多增加几行,修改如下并保存(为后面日期读写与修改,日期形式修改成如下):
603112,2022-4-1,,13.56,13.97,13.55,13.87,3750000
603112,2022-4-2,,13.75,14.25,13.69,14.03,4003500
603112,2022-4-3,,13.69,14.11,13.61,13.95,3956500
603112,2022-4-4,,14.3,14.3,13.73,13.89,4250000
603112,2022-4-5,,14.1,14.5,13.93,14,4013500
603112,2022-4-6,,14.5,15.4,14.35,15.4,9056500
603112,2022-4-7,,16,16.94,15.85,16.94,3750000
4、股票的收益率等
股市中最常见的就是涨幅,也就是今日收盘价相对昨日涨跌的比例,即 (今日收盘价-昨天收盘价)/昨日收盘价*100,numpy中的 diff()
函数可以返回一个由相邻数组元素的差值构成的数组,由于相邻数据相减,因此diff()
数组数据较原数组少一个。
如上述修改后,有7天的收盘价,diff()
计算出的结果就只有6位,
import numpy as np
#读取csv文件
c,v=np.loadtxt('data.csv', delimiter=',', usecols=(6,7), unpack=True)
#股票的简单收益率
# diff 函数可以返回一个由相邻数组元素的差值构成的数组
results = np.diff(c)
print(results)
print('\n')
results1 = np.diff(c)/c[:-1]*100 #相对前一天的涨幅
print(results1)
print('\n')
Standard_deviation =np.std(results) # 计算出标准差
print(Standard_deviation)
运行结果,代码、excel进行相比较: 5、对数收益与波动率
1)对数收益:log 函数得到每一个收盘价的对数,再对结果使用 diff 函数即可,
logreturns = np.diff( np.log(c) )
print(logreturns)
运行结果:
[ 0.01146966 -0.00571839