Numpy(NumericalPython)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
Numpy — 数值计算库
- num — numerical 数值化的
- py — python
ndarry
- n — 任意个
- d — dimension 维度
- array — 数组
np.函数名
ndarry.方法名
一、ndarry
NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items"的集合。
用ndarray进行存储:
1. 优势
-
存储风格
-
ndarray - 相同类型 - 通用性不强
-
list - 不同类型 - 通用性很强
-
-
并行化运算
- ndarray 支持向量化运算
-
底层语言
- Numpy 底层使用 C 语言编写,内部解除了 GIL(全局解释器锁),其对数组的操作速度不受 Python 解释器的限制,效率远高于纯 Python 代码。
2. 属性
数组属性反映了数组本身固有的信息
属性名字 | 属性解释 |
---|---|
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarray.size | 数组中的元素数量 |
ndarray.itemsize | 一个数组元素的长度(字节) |
ndarray.dtype | 数组元素的类型 |
3. ndarry的形状
a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2,3,4])
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
a.shape # (2,3) 二维数组
b.shape # (4,) 一维数组
c.shape # (2,2,3) 三维数组。有两个二维数组,每个二维数组里面嵌套了2个一维数组,每个一维数组中有3个元素
最外层有几个方括号就是几维的
4. 默认情况
在创建 ndarray 的时候,如果没有指定类型,默认:整数 int64/int32 浮点数 float64/float32
5. 生成数组的方法
-
生成0和1的数组
- np.zeros(shape=(3,4),dtype=“float32”)
- np.ones(shape=[2,3],dtype=np.int64)
-
从现有数组中生成
- data1=np.array(score) # 深拷贝
- data2=np.asarray(score) # 浅拷贝(score中的值改变,data2会跟着改变)
- data3=np.copy(score) # 深拷贝
-
生成固定范围的数组
- np.linspace(0,10,5) # [0,10] 等距离的10个数
- np.arange(0,10,5) # [0,10) 步长为5
6. 生成随机数组
-
均匀分布
- 均匀分布(UniformDistribution)是概率统计中的重要分布之一。顾名思义,均匀,表示可能性相等的含义。均匀分布在自然情况下极为罕见,而人工栽培的有一定株行距的植物群落即是均匀分布。
- data1=np.random.uniform(-1,1,1000000) # [low,high)
-
正态分布
- 正态分布是一种概率分布。正态分布是具有两个参数u和o的连续型随机变量的分布,第一参数u是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的标准差,所以正态分布记作N(u,σ)。
- 标准差与方差的意义:可以理解成数据的一个离散程度的衡量
- data2=np.random.normal(loc=1.75,scale=0.1,size=1000000) # loc:均值;scale:标准差
7. 切片索引
stock_change[0,:3] # 获得第0的前3列
8. 形状修改
- stock_change.reshape(10,8) # 返回新的ndarry,原始数据没有改变。只是单纯按照新的形状的作切割。
- stock_change.resize(10,8) # 没有返回值,对原始的ndarry进行了修改。只是单纯按照新的形状的作切割。
- stock_change.T # 转置。行列互换
9. 类型修改
- stock_change.astype(“int64”) # 修改类型为“int64”
- stock_change.tobytes() # 序列化到本地
10. 数组的去重
- 二维的去重:np.unique(ndarray)
- 一维的去重:先使用ndarray.flatten()将ndarray转换为一维数组,然后使用set()去重。set(ndarray.flatten())
二、ndarry的运算
1. 逻辑运算
操作符合某一条件的数值
- 布尔索引
ndarray > 0.5 # ndarray中大于0.5的为True,小于0.5的为False
ndarray[ndarray > 0.5] # 输出大于0.5的项
ndarray[ndarray > 0.5] = 1.1 # 将大于0.5的项置为1.1
- 通用判断函数
- np.all(布尔值)
- 只要有一个False就返回False,只有全是True才返回True
- np.any(布尔值)
- 只要有一个True就返回True,只有全是False才返回False
- np.all(布尔值)
ndarray[0:2, 0:5] # 取出第0行—第1行 且 第0列—第4列的数据
ndarray[:5,:] # 选中前5行的数据
-
np.where() 三元运算符
-
np.where(布尔值,True的位置的值,False的位置的值)
-
-
复合逻辑需要结合np.logical_and和np.logical_or使用
- np.logical_and(ndarray>0.5,ndarray<1) # 判断ndarray中的值是否既大于0.5,且小于1
np.where(np.logical_or(ndarray>0.5,ndarray<-0.5),11,3) # ndarray中的值,如果大于0.5或者小于-0.5,满足前述条件则将该项的值置为11,否则置为3
2. 统计运算
-
统计指标函数
最小值 min 最大值 max np.max(a, axis=None, out=None, keepdims=False) 平均值 mean 中位数 median 方差 var 标准差 std np.amx(axis……)
- 二维数组时,当axis=0时表示取每一列的最大值
- 二维数组时,当axis=1时表示取每一行的最大值
- 三维数组时,当axis=0、1、2…… 具体百度
-
返回最大值、最小值的位置
- np.argmax(tem,axis=)
- np.argmin(tem,axis=)
4. 广播机制
广播(Broadcast)是numpy对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。如果两个数组 a 和b 形状相同,即满足 a.shape ==b.shape,那么a*b的结果就是a与b数组对应位相乘。这要求维数相同,且各维度的长度相同。
为了进行广播,操作中两个数组的尾随轴的大小必须相同,或者其中一个必须是1。
5. 数组间运算
-
数组与数的运算
- 直接运算
- ndarry +100 # 对ndarry中每个元素加10
-
数组与数组的运算
-
广播机制 broadcast
-
执行 broadcast 的前提在于,两个 nadarray 执行的是 element-wise 的运算,Broadcast 机制的功能是为了方便不同形状的 ndarray(numpy 库的核心数据结构)进行数学运算。
当操作两个数组时,numpy 会逐个比较它们的 shape(构成的元组 tuple),只有在下述情况下,两个数组才能够进行数组与数组的运算。
- 维度相等
- shape(其中相对应的一个地方为 1)
-
6. 矩阵运算
矩阵英文 matrix,和 array 的区别是:矩阵必须是 2 维的,但是 array 可以是多维的。
-
存储矩阵
- ndarray存储矩阵 np.array()
- matrix存储矩阵 np.mat()
-
运算规则:矩阵乘法规则(M 行,N 列)x (N 行,L 列) = (M 行,L 列)
- A(2,3) B(3,2)
- C = A * B C(2,2)
-
运算
-
如果是用ndarray存储矩阵:
- np.dot()
- np.matmul()
- ndarray @ ndarray
-
如果是用matrix存储矩阵:
- 直接相乘
-