1 介绍
- Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
- Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。
- Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
1.1 ndarray
Numpy提供了一个N dimension array,即n维数组
1.2 numpy与list对比
- 存储风格:
ndarray 内部存储类型相同,存储空间连续,但通用性不强
list 内部存储类型可以不同,存储空间未必连续,通用性较强 - 并行化计算:ndarray支持向量化运算
- 底层语言:
Numpy底层采用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。
属性方法
属性名字 | 属性解释 |
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度(字节) |
ndarray.dtype | 数组元素的类型 |
使用方法 数组名.函数名 |
2 基本操作
2.1 ndarray形状和类型
形状
import numpy as np a = np.array([[1,2,3],[4,5,6]]) #(2,3) b = np.array([1,2,3,4]) #(4,) c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])#(2,2,3) print(a.shape) print(b.shape) print(c.shape)
元组:表示外到内的元素个数,维度就是括号层数。
运行结果
类型
创建数组时指定即可
# 创建数组的时候指定类型 np.array([1.1, 2.2, 3.3], dtype="float32")
2.2 生成数组
- 生成0 1 数组
# 1 生成0和1的数组 a=np.zeros(shape=(3, 4), dtype="float32") ##其中shape的参数为列表/元组均可,用于表示生成的数组维度
运行结果
- 从现有数组生成
a1=np.array(a) #深拷贝 a2=np.copy(a) #深拷贝 a3=np.asarray(a)#浅拷贝 a4=a #浅拷贝
- 生成固定范围的数组
a1=np.linspace(0, 10, 5) # 生成[0,10]之间等距离的5个数,左右均为闭区间 a2=np.arange(0, 11, 5) # [0,11),5为步长生成数组 ,左闭右开 print(a1) print(a2)
- 生成随机数组
# 生成均匀分布的一组数[low,high) 左闭右开,size是数量 data1 = np.random.uniform(low=-1, high=1, size=1000000) ########注意这两处的size都可以规定数组形状 size=(8,100) # 生成正态分布的一组数,loc:均值;scale:标准差,size数量 data2 = np.random.normal(loc=1.75, scale=0.1, size=1000000) print(data1) print(data2)
运行结果
2.3 索引切片
stock_change = np.random.normal(loc=0, scale=1, size=(8, 10)) # 获取第一个股票的前3个交易日的涨跌幅数据 print(stock_change[0, :3]) a[1, 0, 2] = 1000 a[1][0][2] = 1000
2.4 形状改变
stock_change.reshape((10, 8)) # 返回新的ndarray, 原始数据没有改变 stock_change.resize((10, 8)) # 没有返回值, 对原始的ndarray进行了修改 stock_change.T # 转置 行变成列,列变成行 返回一个ndarray,原数据未改变 ##reshape()是一个函数,因此第一个括号是函数个括号,而第二个括号是因为传入了一个元##组,其实用列表也可
2.5 类型修改
stock_change.astype("int32") stock_change.tostring() # ndarray序列化到本地??????
2.6 数组去重
temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]]) np.unique(temp) set(temp.flatten())##set的操作对象需要时一维的,.flatten()可以压缩为一维的
3 ndarray运算
3.1 逻辑运算
- 运算符
stock_change = np.random.uniform(low=-1, high=1, size=(5,10)) # 逻辑判断, 如果涨跌幅大于0.5就标记为True 否则为False stock_change > 0.5 #返回一个True和False的等大小矩阵 stock_change[stock_change > 0.5] = 1.1 #将>0.5的全部改为1
通用判断函数
#以下两者均只返回一个布尔值 # 判断stock_change[0:2, 0:5]是否全是上涨的 np.all(stock_change[0:2, 0:5] > 0) # 判断前5只股票这段期间是否有上涨的 np.any(stock_change[:5, :] > 0)
三元运算符
# np.where(布尔表达式,True的位置的值,False的位置的值),类似于三元运算符,不# 过需要利用函数 np.where(temp > 0, 1, 0) ###涉及符合逻辑需要额外的函数logical_and/or # 大于0.5且小于1 np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0) # 大于0.5或小于-0.5 np.where(np.logical_or(temp > 0.5, temp < -0.5), 11, 3)
3.2 统计运算
- 主要函数:min max mean median(中位数) var(方差) std(标准差)
- 使用方法:np.函数名(数组名) 或 数组名.方法名
- 同时应当注意 axis的使用。 axis=0表示列 axis=1表示行 axis=-1 表示最后一维度
###返回值 stock_change.max() #将返回最大值 np.max(stock_change,axis=1)#将返回一个向量,即所有行的最大值 ###返回索引 np.argmax(tem,axis=0) np.argmin(tem,axis=0)
3.3 数组运算
- 数组与数字的运算
正常的运算即可 加减乘除等 - 数组与数组的运算
广播机制
执行broadcast的前提在于,两个nadarray执行的是element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray(numpy库的核心数据结构)进行数学运算。
当操作两个数组时,numpy会逐个比较它们的shape(构成的元组tuple),只有在下述情况下,两个数组才能够进行数组与数组的运算。
- 维度相等
- shape(其中相对应的一个地方为1)
具体解释解释就是看这个图。
比如(不一定是乘法)数组A*B,将两者的维度写出,如下,将维度从尾部开始对齐,则满足运算的要求是:
- 对应的维度相同
- 若维度不同,则其中一个维度应当为1
矩阵运算
- 可以通过np.mat(array)将数组转化为矩阵
- 矩阵的乘法必须满足运算规则,即(m,n)*(n,l)=(m,l)
如果是二维数组实现矩阵运算
np.dot(data,data1) np.matmul(data,data1) data @ data1
如果是矩阵进行运算
data1*data2 1
3.4 数组合并分割
- numpy.hstack 水平拼接
- numpy.vstack 竖拼接
- numpy.concatenate((a1,a2),axis=0|1) 水平|竖拼接
np.hstack((a, b)) np.vstack((a, b)) np.concatenate((a, b), axis=1)