numpy基础知识
Numpy是Numerical Python 的简称,一下内容是numpy的主体:
- ndarray,一种高效的多维数组,提供灵活的广播操作(后面会提及)
- 对所有数据进行快速而灵活的矩阵计算
- pandas的基础
- 其他的巴拉巴拉没什么意思,在巴拉巴拉就要小魔仙变身了
构造np数组
最最最基本的方式就是
import numpy as np
np.array([1,2,3])
array([1, 2, 3])
很多np生成数组的方式我也是知道的,当然也有部分不清楚,就在这块做个总结:
np.linspace(1,5,11) # 起始、终止(包含)、样本个数
np.arange(1,5,2) # 起始、终止(不包含)、步长
np.zeros((2,3)) # 传入元组表示各维度大小
np.eye(3) # 3*3的单位矩阵
np.eye(3, k=1) # 偏移主对角线1个单位的伪单位矩阵
np.full((2,3), 10) # 元组传入大小,10表示填充数值
np.full((2,3), [1,2,3]) # 通过传入列表填充每列的值
构造随机数组
numpy中用于生成随机数的函数有rand,randn,randint,choice,其功能的如下
np.random.rand(3) # 生成服从0~1均匀分布的三个随机数
np.random.randn(3) #生成3个服从标准正态分布的随机数
np.random.randint(1,10,1) #指定生成随机整数的最小值最大值和不长
choice 可以从给定的列表中以一定的概率的方式抽取结果,在不设置概率的时候默认为均匀分布,默认为有放回抽样
my_list = ['a', 'b', 'c', 'd']
np.random.choice(my_list, 2, replace=False, p=[0.1, 0.7, 0.1 ,0.1])
输出内容
array(['b', 'a'], dtype='<U1')
提到在使用返回相同数量的元素时,相当于使用了permutation函数,即只是单纯将数据打乱了,在后面的机器学习中十分有用。
np.random.permutation(my_list)
array(['b', 'd', 'a', 'c'], dtype='<U1')
最后还要画一个重点,那就是随机数种子,通过随机数种子可以固定产生一个随机数。
好处实在是太多了,在后面的数据分析、统计的过程中,固定随机数对检验十分重要:
np.random.seed(0)
np.random.rand() # 此时生成的随机数是固定的
数组的变形与合并
转置 .T
二维数组合并
其中r_表示按照行进行合并,c_ 表示按列进行合并
np.r_[np.zeros((2,3)),np.zeros((2,3))] #注意zeros里面接的是元组
输出结果
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
np.c_[np.zeros((2,3)),np.zeros((2,3))] #注意zeros里面接的是元组
输出结果
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
维度变换
reshape可以帮助用户把原数组按照新的维度进行排列,使用时有C模式和F模式,分别表示逐行和逐列的方式进行读取。
target = np.arange(8).reshape(2,4)
target
可以看一下这两种填充方式的区别……,
算了还是不看了,应该不会考……
reshape同时是允许有维度空缺的,用-1进行填充
target.reshape((4,-1))
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
np的切片与索引
mark一下时间点,现在是12.15日下午1点半。为了完成这部分的学习,我实际上花了很长的时间,但是和datawhale中分享的优秀范文相比,也是发现自己仿佛在抄课本。想要改进一下自己的记笔记的风格,想想好吧,我是真的小白,很多东西我是真不知道……
阳明说,人生有三大蠢事不要做:
- 不懂装懂
- 其他几个不记得了-
array类型支持使用slice
类型进行切边,以start: end: step
的形式切片,另一方面可以使用np.ix_ 在对应的维度上使用布尔索引
常用函数
numpy实际上是python学习中比较重要且基础的内容。这里出现了函数有where\nonzero/argmax/argmin/any/all/comprod/cumsum/diff/以及各类统计函数
实际上这些方法中的大部分我都曾经接触过或者使用过,每次用的时候都是懵逼他妈给懵逼开门,懵逼到家了。实际上很多内容应该早就要进行总结,不会总结的人是不会学习的人,你说呢?
1.where
函数,是一种条件函数,可以用于指定满足条件和不满足条件位置的对应填充之“
a = np.array([-1,1,-1,0])
np.where(a>0, a, 5) # 对应位置为True时填充a对应元素,否则填充5
输出结果
array([5, 1, 5, 5])
2.nonzero
用于返回非零数的索引,而argmax/argmin
分别用于返回最大值和最小值的位置索引
any
当序列中至少存在一个True或者非零元素时返回True,否则返回False
all
指当序列元素 全为 True
或非零元素时返回True
,否则返回False
4.cumprod
是累乘函数,cumsum
是累加函数, 返回同样长度的数组,如下
a = np.array([1,2,3])
a.cumprod()
array([1, 2, 6], dtype=int32)
5.统计函数,其中包括max, min, mean, median, std, var, sum, quantile
,其中分位数计算是全局方法,因此不能通过array.quantile
的方法调用:
6.对于协方差和相关系数分别可以利用cov, corrcoef
7.最后一个,可以使用numpy按照行或者列进行统计,设置参数axis=0时,(也是默认的)为列的统计结果,axis=1时为行的统计结果。
广播机制
广播机制是用于处理两个不同维度数组的操作
- 在一个多维数组和标量运算时,将标量扩充到和多维数组一个维度进行计算
- 在二维数组的运算中,在维度完全一致时,可以直接运算。
- 在 m ∗ 1 m*1 m∗1或者 1 ∗ n 1*n 1∗n的时候,则会自动将 1 1 1维数组扩充到与另一个维度相适应
- 如果不是以上的情况就无法运算
向量与矩阵的计算
好久没碰线代,好多内容都忘了,这也反映前段时间学的东西只是为了期末考试,啥都没学到,考前刷两套卷子。还是得为自己学习。
向量的内积dot
a ⋅ b = ∑ i a i b i \rm \mathbf{a}\cdot\mathbf{b} = \sum_ia_ib_i a⋅b=i∑aibi
a = np.array([1,2,3])
b = np.array([1,3,5])
a.dot(b)
22
向量的范数这块内容,等我去补一下线代的知识再回过头来写这个。
矩阵乘法:@
[ A m × p B p × n ] i j = ∑ k = 1 p A i k B k j \rm [\mathbf{A}_{m\times p}\mathbf{B}_{p\times n}]_{ij} = \sum_{k=1}^p\mathbf{A}_{ik}\mathbf{B}_{kj} [Am×pBp×n]ij=k=1∑pAikBkj
a = np.arange(4).reshape(-1,2)
b = np.arange(-4,0).reshape(-1,2)
a@b
array([[ -2, -1],
[-14, -9]])