上一篇请移步【1】Anaconda基本命令以及相关工具:jupyter、numpy、Matplotilb_水w的博客-CSDN博客
目录
◼ 数组的合并-concatenate、vstack、hstack
- numpy的切片操作,一般结构如num[a:b,c:d],分析时以逗号为分隔符,
- 逗号之前为要取的num行的下标范围(a到b-1),逗号之后为要取的num列的下标范围(c到d-1);
- 前面是行索引,后面是列索引。
- 如果是这种num[:b,c:d],a的值未指定,那么a为最小值0;
- 如果是这种num[a:,c:d],b的值未指定,那么b为最大值;c、d的情况同理可得。

(1)对于一维数组
- # 索引
- a[0] # 取a中的第1个元素
-
- a[4] # 取a中的第5个元素
-
- a[-1] # 取a中的最后1个元素
-
-
- # 切片
- a[0:5] # 取a中的第1~5个元素
- a[:5]
-
- a[4:] # 取a中的第5个一直到最后的所有元素
-
- a[-3:] # 取a中的从倒数第3个开始一直到最后的所有元素
-
- a[:] # 取a中的所有元素
-
- a[::2] # 取a中的所有元素,间隔步长为2
-
- a[::-1] # 倒序取a中的所有元素


(2)对于二维数组
- A[0,0] # 取A中的第1行1列的元素
-
- A[0,:] # 取A中的第1行的所有元素
- A[0]
-
- A[-1] # 取A中的最后1行的所有元素
-
-
- A[:,0] # 取A中的第1列的所有元素
- A[:,-1] # 取A中的最后1列的所有元素
-
- A[:2,:4] # 取A中的前2行前4列的所有元素
-
- A[::-1,::-1] # 取A中所有行和列倒序的所有元素




在numpy使用切片的时候要注意,numpy切片的值修改会导致原数组的值也会修改。
- X = A[:2,:3] # 与原数组A有了关联关系
- X[0,0] = 666
- X
- A
-
- # 输出结果:
- array([[666, 1, 2],
- [ 5, 6, 7]])
- array([[666, 1, 2, 3, 4],
- [ 5, 6, 7, 8, 9],
- [ 10, 11, 12, 13, 14],
- [ 15, 16, 17, 18, 19]])
如果想避免这种情况,我们可以使用copy() 。
- X = A[:2,:3].copy() # 相当于复制了一个新的数组,与原数组A没有了关联关系
- X[0,0] = 666
- X
- A
-
- # 输出结果:
- array([[666, 1, 2],
- [ 5, 6, 7]])
- array([[0, 1, 2, 3, 4],
- [ 5, 6, 7, 8, 9],
- [ 10, 11, 12, 13, 14],
- [ 15, 16, 17, 18, 19]])
vstack、hstacknumpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
参数:
- a1, a2, ...:sequence of array_like,除了将被对应的轴之外,数组必须是相同的形状;
- axis:int, optional,将被组合的轴,默认为0,如果为None,将被展开为一维数组;
- out:ndarray, optional,如果给定,将存放结果,尺寸必须匹配;
- dtype:str or dtype,给定输出的数据类型,不能和参数 out 一起出现;
- casting:{‘no’, ‘equiv’, ‘safe’, ‘same_kind’, ‘unsafe’}, optional,控制可能发生的数据转换类型。默认为 ‘same_kind’
结果: res是组合后的数组;

(1)合并X和a的时候,需要先让X和a有相同的维度,
np.concatenate((X,a.reshape(1,4)))

这时的X和a本身是没有任何改变的。
(2)如果想得到合并值的数组,只需要把合并结果赋值给变量,

numpy.vstack(tup)参数:
tup:sequence of arrays,数组除第一维外,形状相同;结果:
stacked:ndarray,竖直(行)顺序堆叠数组,将给定的数组连接的数组;

numpy.hstack(tup)参数:
tup:sequence of arrays,数组除第二维外,形状相同;结果:
stacked:ndarray,水平(按列)顺序堆叠数组,将给定的数组连接的数组;
与np.concatenate((X,B),axis=1)的功能是相同的,

numpy.split(ary, indices_or_sections, axis=0)
参数:
- ary:ndarray,被划分的数组;
- indices_or_sections:int or 1-D array,如果是 int,将被划分为N个对应维度等长的数组,如果是 1-D array,表示数组的拆分位置;
- axis:int, optional,拆分的维度,默认0;
返回:
- sub-arrays:list of ndarrays,数组 ary 的子数组视图的列表;
(1)把数组X的最后一行的元素拆分出来,

(2)把数组X的最后一列的元素拆分出来,

numpy.vsplit(ary, indices_or_sections)
参数:
- ary:ndarray,被划分的数组;
- indices_or_sections:int or 1-D array,如果是 int,将被划分为N个对应维度等长的数组,如果是 1-D array,表示数组的拆分位置;
返回:
- sub-arrays:list of ndarrays,竖直方向上的拆分(拆分成上下的几个数组), 数组 ary 的子数组视图的列表;

numpy.hsplit(ary, indices_or_sections)
参数:
- ary:ndarray,被划分的数组;
- indices_or_sections:int or 1-D array,如果是 int,将被划分为N个对应维度等长的数组,如果是 1-D array,表示数组的拆分位置;
返回:
- sub-arrays:list of ndarrays,水平方向上的拆分(拆分成左右的几个数组), 数组 ary 的子数组视图的列表;

(1)普通数组的矩阵运算不能直接乘以2和两个X相加,需要遍历X,将每个元素乘以2,

(2)而在numpy数组的矩阵运算中,可以直接乘以2,

- np.abs(a) 、np.fabs(a) : 取各元素的绝对值;
- np.sign(a) : 计算各元素的符号值 1(+),0,-1(-);
- np.sqrt(a) : 计算各元素的平方根;
- np.square(a): 计算各元素的平方;
- np.log(a) 、np.log10(a) 、np.log2(a) : 计算各元素的以自然对数e、10、2为底的对数np.exp(a) : 计算各元素的指数运算;
- np.ceil(a) 、np.floor(a) : 计算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整);
- np.round(a) : 各元素四舍五入,奇进偶不进(1.5进为2,但2.5不进);
- np.sin(a)、np.cos(a)、np.tan(a):三角函数;
- np.modf(a) : 将数组各元素的小数和整数部分以两个独立数组形式返回;




- +、-、/、*
- //:整除;
- %:取余;
- **:幂运算;



- +、-、/、*:相加、相减、相除、不是真正意义上的相乘
- dot():真正意义上的相乘;
- .T、transpose():转置;
- linspace():;
- ():;
(1)

(2)定义的数组Z是1x2,但是数组X为2x2,此时竟然可以进行矩阵运算,

虽然numpy可以智能的通过广播的这种形式来进行运算,但事实上并不推荐,因为容易引起混乱。在矩阵运算的过程中,我们尽量还是遵从运算的规律。
(3)逆矩阵

注意:求矩阵的逆时,必须得是方阵,否则会报错,
(4)特征值和特征向量
- np.linalg.det(X)
- np.linalg.eig(X)

NumPy内置了很多计算方法,其中最重要的统计方法及说明具体如下。
- sum(X, axis=1/0):计算矩阵元素的和;矩阵的计算结果为一个一维数组,需要指定行或者列;
- axis传入0:按列求;
- axis传入1:按行求;
- mean(X, axis=1/0):计算矩阵元素的平均值;矩阵的计算结果为一个一维数组,需要指定行或者列求平均值;
- max(X, axis=1/0):计算矩阵元素的最大值;矩阵的计算结果为一个一维数组,需要指定行或者列求最大值;
- min(X, axis=1/0):计算矩阵元素的最小值;矩阵的计算结果为一个一维数组,需要指定行或者列求最小值;
- mean():计算矩阵元素的平均值;
- median():计算矩阵元素的中位数;
- std()、var():求标准差、方差;
- ptp():描述矩阵中最大元素和最小元素之间的差;
- percentile():可以求任意位置的百分位数;
- cumsum(X, axis=1/0):按行或列统计,求矩阵的累加;
- diff(X, axis=1/0):按行或列统计,计算相邻的差;
- prod(X, axis=1/0):按行或列统计,求矩阵的累积;
需要注意的是,用于这些统计方法的数值类型必须是int或者float。

numpy不只是功能强大,还有一些常用的统计函数:




Numpy数组arg运算和排序:
- np. argmin() :最小值索引;
- np.argmax() :最大值索引;
- np. argwhere(x>0.5)指定条件索引,得到值大于0.5的所有索引的位置,可通过x[ind]取出对应的值;
- np.random.shuffle() :打乱顺序;
- np.sort() 排序:
默认以最高维数为单元将x重新排序,不改变x本身的值,而是将排序的结果放到了一个新的数组中;
- x.sort() 排序:
改变x本身的值;x[::-1]降序排序;- np. argsort(X, axis=1/0) 排序索引:返回从小到大的索引排序;
- axis传入0:按列;
- axis传入1:按行;
- np. partition(x,5) 指定位置分割:将x分割成小于5和大于5在左右两侧,此处的5是指有序数组情况下的第5个元素;
- np.argpartition(x,5) 分割索引:返回小于5和大于5对应值的索引值;

(1)
- #1.创建一个随机数组x
- x = np.arange(10)
- x
- #结果:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
-
- #2.将x顺序打乱,且x本身值改变
- np.random.shuffle(x)
- x
- #结果:array([1, 6, 3, 5, 4, 0, 2, 7, 8, 9])
-
- #3.将x重新排序,不改变x本身的值
- np.sort(x)
- #结果:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
- x
- #结果:array([1, 6, 3, 5, 4, 0, 2, 7, 8, 9])
-
- #4.直接使用x.sort()排序,改变x本身的值
- x.sort()
- x
- #结果:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
(2)使用索引,

(3)某些情况下,我们不需要对数组全部排序,我们可以对索引进行切片操作:
np. partition(x,5) 指定位置分割:将x分割成小于5和大于5在左右两侧,此处的5是指有序数组情况下的第5个元素;
np.argpartition(x,5) 分割索引:返回小于5和大于5对应值的索引值;

(3)如果是高维数组,np.sort() 排序是默认以最高维数进行排序的,

- import numpy as np
- x = np.arange(10) # 取0~9的10个整数组成数组
- x
- array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
-
- x[2:8] # 对数组x切片截取2~8的一个子数组
- array([2, 3, 4, 5, 6, 7])
-
- x[2:8:2] # 对数组x切片截取2~8的一个子数组,且步长为2
- array([2, 4, 6])
-
- [x[2],x[5],x[8]] # 取第2,5,8三个位置的元素作为数组
- [2, 5, 8]
-
- index = [2,5,8] # 更简洁的方法---神奇索引:取第2,5,8三个位置的元素作为数组
- x[index]
- array([2, 5, 8])
-
- index = np.array([[1,3,5],[2,4,6]]) # 更简洁的方法---神奇索引:取第1,3,5和2,4,6位置的元素作为二维数组
- x[index]
- array([[1, 3, 5],
- [2, 4, 6]])
神奇索引用于二维数组的情况:
- X = x.reshape(2,-1) # 把x重构成2x5的一个二维数组
- array([[0, 1, 2, 3, 4],
- [5, 6, 7, 8, 9]])
-
- row = np.array([0,1,0]) # 构建索引,row表示行坐标,clo表示列坐标
- col = np.array([0,2,4])
- X[row,col] # 把row和col都传给X
- array([0, 7, 4]) # 输出了3个数字:0行0列,1行2列,0行4列的三个位置的元素
-
- X[0,col] # 都从第0行取值:取0行0列,0行2列,0行4列的三个位置的元素
- array([0, 2, 4])
-
- X[row,:2] # 从前2列取值:取0行前2列,1行前2列,0行前2列的三个位置的元素
- array([[0, 1],
- [5, 6],
- [0, 1]])
-
- col = [True, False, True, False, True] # 还支持传递布尔类型的数组
- X[0,col] # 都从第0行取值:取0行0列,0行2列,0行4列的三个位置的元素
- array([0, 2, 4]) # 输出这三个True对应的元素
(1)如何得到布尔类型的数组呢?我们可以通过“比较”,

(2)比较结果和神奇索引的同时使用,

我们还可以找到数组X中所有的偶数,

(3)比较的更多应用,
对于一维数组,

对于二维数组,

(2)对于多个条件的组合使用:与& 、或| 、非~
