numpy是Python中的一个运算速度非常快的一个数学库,主要用于对多维数组执行计算。
导入方式
import numpy as np
一、创建N维数组ndarray
可用“dtype = float”等指定数据类型
可选参数order='C’行优先/'F’列优先
1.array() 将列表转换为数组
a = [[1,2,3],[4,5,6]]
b = np.array(a) #将列表转换为数组
print("a =",a)
print("b =",b)
2.zeros() 全0数组
数组的数据类型dtype默认为float
a = np.zeros((4,5)) #生成4行5列全0数组
print("a =",a)
3.ones() 全1数组
数组的数据类型dtype默认为float
a = np.ones((4,5)) #生成4行5列全1数组
print("a =",a)
4.eye() 单位矩阵
数组的数据类型dtype默认为float
a = np.eye(4) #生成4行4列的单位矩阵
print("a =",a)
5.empty() 生成接近于0的数组
数组的数据类型dtype默认为float
a = np.empty((4,5)) #生成4行5列的接近于0的数组
print("a =",a)
6.full() 生成指定形状指定值的完整数组
a = np.full((5, 10), 1) #生成5行10列的值为1的完整数组
print("a =",a)
7.arange() 生成有序的数列或数组,range的numpy版
省略开始则默认从0开始,省略步长则默认步长为1
a = np.arange(1,10,2) #生成一个从1开始到10结束(不包括结束值),步长为2的数列
b = np.arange(10) #生成一个从0开始到10结束(不包括结束值),步长为1的数列
print("a =",a)
print("b =",b)
8.linspace() 生成有序的数列或数组,类似arange(),第三个参数为数组长度
a = np.linspace(1,10,20) #生成一个从1开始到10结束(包括结束值),总共有20个数的等距的数列
print("a =",a)
9.修改数组的数据类型
a = np.ones(6)
print("a =",a)
a = np.int8(a)
print("a =",a)
b = np.array([1, -2, 3, -4], dtype='int8')
print("b =",b)
b = np.float32(b)
print("b =",b)
二、常用属性
1.T 数组的转置
a = [[1,2,3],[4,5,6]]
b = np.array(a) #将列表转换为数组
c = b.T #将数组b转置,即行列互换
print("a =",a)
print("b =",b)
print("c =",c)
2.dtype 数组元素的数据类型
a = np.zeros(10) #生成一个1行10列的全0数组
print("a =",a)
print("a的数据类型为",a.dtype)
3.size 数组元素的个数
a = np.eye(4) #生成4行4列的单位矩阵
print("a =",a)
print("a的元素个数为",a.size) #输出为16,即a中有16个元素
4.ndim 数组的维数
a = np.eye(4) #生成4行4列的单位矩阵
print("a =",a)
print("a的维数是",a.ndim) #输出为2,即a是一个二维数组
5.shape 数组的形状
a = [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]
b = np.array(a) #将列表转换为数组
print("a =",a)
print("b =",b)
print("b的维数是",b.ndim) #输出为3,即b是一个三维数组
print("b各维度的长度分别为",b.shape) #输出为(2,2,3),即a是一个形状为2层2行3列的三维数组
6.flatten 返回一个展开成一维的数组,生成的新数组是原数组的深层拷贝,对新数组的修改不会影响原数组
order:可选参数,数组数据的读取顺序:“C”表示按行优先展开;“F”表示按列优先展开;“A”: 当输入数组在内存中是连续的,则以列优先的方式展开,否则以行优先的方式展开;取值为“K”表示按照数组元素在内存中出现的顺序展开
A = np.array([[1,2],[3,4],[5,6]])
B = A.flatten() # 行优先
C = A.flatten('A') # 行优先
D = A.flatten('F') # 列优先
print("A =",A)
print("B =",B)
print("C =",C)
print("D =",D)
7.ravel() 返回一个展开成一维的数组,新数组是原数组的view,两个数组数据共享相同的内存,修改新数组会导致原数组发生改变
order:可选参数,数组数据的读取顺序:“C”表示按行优先展开;“F”表示按列优先展开;“A”: 当输入数组在内存中是连续的,则以列优先的方式展开,否则以行优先的方式展开;取值为“K”表示按照数组元素在内存中出现的顺序展开
A = np.array([[1,2],[3,4],[5,6]])
B = np.ravel(A) # 默认行优先
C = np.ravel(A, order='A') # 行优先
D = np.ravel(A, order='F') # 列优先
print("A =",A)
print("B =",B)
print("C =",C)
print("D =",D)
print('d:', d, sep='\n')
三、索引
1.整数序号索引:数组名[索引序号]
正值索引:从左往右,第一个序号是0,最后一个序号是长度减1
负值索引:从右往左,第一个序号是-1,最后一个序号是长度的负数
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
b = a[1]
c = a[1,1]
d = a[1,1,1]
print("a =",a)
print("b =",b)
print("c =",c)
print("d =",d)
2.切片索引
[开始索引:结束索引:步长]
切片包括开始索引位置的元素,但不包括结束索引位置的元素
步长可以为正整数(从左往右切),也可以为负整数(从右往左切,数组逆序排列)
省略开始索引则默认从第一个序号开始(包括),省略结束索引则默认到最后一个序号结束(包括),省略步长则默认步长为1
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]])
b = a[:1]
c = a[1,1:]
d = a[1,1,::2]
e = a[1,1,::-1]
f = a[1,1,1::-1]
print("a =",a)
print("b =",b)
print("c =",c)
print("d =",d)
print("e =",e)
print("f =",f)
3.数组索引
每个维度都由相应的索引数组指定位置,省略索引则代表取全体
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]])
b = a[np.array([0,2])] #获取数组a的第0层和第2层,输出数组为2层2行3列的三维数组
c = a[np.array([0,2]),np.array([0,1])] #获取数组a第0层第0行的元素和第2层第1行的元素,输出数组为2行3列的二维数组
d = a[np.array([0,2]),np.array([0,1]),np.array([1,2])] #获取数组a第0层第0行第1列的元素和第2层第1行第2列的元素,输出数组为1行2列的一维数组
e = a[np.array([[0,2],[2,1]]),np.array([[0,1],[1,1]]),np.array([[1,2],[0,1]])] #获取数组a[层索引数组,行索引数组,列索引数组]对应位置的元素,[左上:0层0行1列,右上:212,左下:210,右下:111],输出数组为2行2列的二维数组
print("np.array([0,2]) =",np.array([0,2]))
print("np.array([0,2])各维度的长度分别为",np.array([0,2]).shape) #输出为(2,)
print("np.array([0,2])的维数是",np.array([0,2]).ndim) #输出为1,即np.array([0,2])是一个一维数组
print("a =",a)
print("a各维度的长度分别为",a.shape) #输出为(3, 2, 3)
print("b =",b)
print("b各维度的长度分别为",b.shape) #输出为(2, 2, 3),最外层维度的长度与np.array([0,2])的长度相同都为2
print("c =",c)
print("c各维度的长度分别为",c.shape) #输出为(2, 3),最外层维度的长度与np.array([0,2])的长度相同都为2
print("d =",d)
print("d各维度的长度分别为",d.shape) #输出为(2,),与np.array([0,2])的shape相同
print("d的维数是",d.ndim) #输出为1,即d是一个一维数组
print("e =",e)
print("e各维度的长度分别为",e.shape) #输出为(2, 2),与np.array([[0,2],[2,1]])的shape相同
print("nnp.array([[0,2],[2,1]])各维度的长度分别为",np.array([[0,2],[2,1]]).shape)
4.布尔索引
True对应位置的保留,False对应位置的舍弃
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]],[[13,14,15],[16,17,18]]])
b = a[np.array([False,True,False])]
c = a[np.array([False,True,False]),np.array([True,False])]
d = a[np.array([False,True,False]),np.array([True,False]),np.array([True,False,True])]
print("a =",a)
print("a各维度的长度分别为",a.shape) #输出为(3, 2, 3)
print("a的维数是",a.ndim) #输出为3,即a是一个三维数组
print("b =",b)
print("b各维度的长度分别为",b.shape) #输出为(1, 2, 3)
print("b的维数是",b.ndim) #输出为3,即b是一个三维数组
print("c =",c)
print("c各维度的长度分别为",c.shape) #输出为(1, 3)
print("c的维数是",c.ndim) #输出为2,即c是一个二维数组
print("d =",d)
print("d各维度的长度分别为",d.shape) #输出为(2,)
print("d的维数是",d.ndim) #输出为1,即d是一个一维数组
四、数组的常用操作
1.reshape() 改变数组形状
a = np.arange(1,20,2) #生成一个从1开始到20结束(不包括结束值),步长为2的数列
b = a.reshape((2,5)) #将a按行优先重新排成2行5列的数组
c = a.reshape((2,5),order='F') #将a按列优先重新排成2行5列的数组
print("a =",a)
print("b =",b)
print("c =",c)
2.repeat(repeats, axis=None)
a = np.eye(3) #生成一个3行3列的单位矩阵
b = a.repeat(3,axis=0) #将a沿着行轴复制3份,这里是按行复制与Matlab的整个矩阵一起复制不同
print("a =",a)
print("b =",b)
3.append(arr, arr或values)
不能拼接三个及以上数组,append函数返回的始终是一个一维数组,所以一般用于一维数组的拼接
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.append(a,b)
d = np.append(c,15)
print("a =",a)
print("b =",b)
print("c =",c)
print("d =",d)
4.hstack((a,b)) 沿着水平方向拼接数组
一般用于二维数组的拼接
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[7,8,9],[10,11,12]])
c = np.hstack((a,b)) #或c = np.hstack([a,b])
print("a =",a)
print("b =",b)
print("c =",c)
5.vstack((a,b)) 沿着垂直方向拼接数组
一般用于二维数组的拼接
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[7,8,9],[10,11,12]])
c = np.vstack((a,b)) #或c = np.vstack([a,b])
print("a =",a)
print("b =",b)
print("c =",c)
6.concatenate((a1, a2, …), axis) 沿着某一个轴拼接数组
concatenate()效率比append()更高,适合大规模的数据拼接
a1, a2, …:待拼接的数组(待拼接的数组在该轴以外的轴的长度必须相同)
axis:沿着它连接数组的轴,默认为0。axis=0相当于vstack沿着垂直(列)方向拼接;axis=1相当于hstack沿着水平(行)方向拼接
一维数组的拼接
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.concatenate((a,b))
print("a =",a)
print("b =",b)
print("c =",c)
二维数组的拼接
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[7,8,9],[10,11,12]])
c = np.concatenate((a,b)) #沿着垂直方向拼接 相当于 vstack
d = np.concatenate((a,b),axis=1) #沿着水平方向拼接 相当于 hstack
print("a =",a)
print("b =",b)
print("c =",c)
print("d =",d)
三维数组的拼接
三维数组有三个轴,shape的(,)从左到右分别对应轴axis=0,1,2的长度
a = np.array([[[1,2,3],[4,5,6]]])
b = np.array([[[7,8,9],[10,11,12]]])
c = np.array([[[13,14,15],[16,17,18]]])
print("a =",a,'\n',a.shape) #shape为(1, 2, 3)
print("b =",b,'\n',b.shape) #shape为(1, 2, 3)
print("c =",c,'\n',c.shape) #shape为(1, 2, 3)
A = np.concatenate((a,b,c),axis=0)
print(A,'\n',A.shape) #shape为(3, 2, 3)
B = np.concatenate((a,b,c),axis=1)
print(B,'\n',B.shape) #shape为(1, 6, 3)
C = np.concatenate((a,b,c),axis=2)
print(C,'\n',C.shape) #shape为(1, 2, 9)
五、数组的常用一元函数
1.abs() 整数的绝对值、fabs() 浮点数的绝对值
a = np.arange(4,-5,-1) #生成一个从4开始到-5结束(不包括结束值),步长为-1的数列
print("a =",a)
print("a各元素的绝对值是",np.abs(a))
b = np.arange(-2,1.2,0.4) #生成一个从-2开始到1.2结束(不包括结束值),步长为0.4的数列
print("b =",b)
print("b各元素的绝对值是",np.fabs(b))
2.sqrt() 平方根
a = np.arange(10) #生成一个从0开始到10结束(不包括结束值),步长为1的数列
print("a =",a)
print("a各元素的平方根是",np.sqrt(a))
3.square() 平方
a = np.arange(10) #生成一个从0开始到10结束(不包括结束值),步长为1的数列
print("a =",a)
print("a各元素的平方是",np.square(a))
4.ceil() 向上取整,保留原来的dtype
a = np.arange(-2,1.2,0.4) #生成一个从-2开始到1.2结束(不包括结束值),步长为0.4的数列
print("a =",a)
print("a各元素向上取整的值是",np.ceil(a))
5.floor() 向下取整,保留原来的dtype
a = np.arange(-2,1.2,0.4) #生成一个从-2开始到1.2结束(不包括结束值),步长为0.4的数列
print("a =",a)
print("a各元素向下取整的值是",np.floor(a))
6.rint() 四舍五入,保留原来的dtype
a = np.arange(-2,1.2,0.4) #生成一个从-2开始到1.2结束(不包括结束值),步长为0.4的数列
print("a =",a)
print("a各元素四舍五入的值是",np.rint(a))
7.isinf() ,测试元素是否为无穷大inf,并将结果作为布尔数组返回
a = np.array([np.nan,2,-np.inf,0,np.inf])
print("a =",a)
print("Is inf?",np.isinf(a))
8.isnan() ,测试元素是否为NaN,并将结果作为布尔数组返回
a = np.array([np.nan,2,-np.inf,0,np.inf])
print("a =",a)
print("Is NaN?",np.isnan(a))
六、数组的常用二元函数
1.add(a,b) 数组对应位置元素相加 等同于a+b
a = np.array([2,1,4,0,3,6])
b = np.array([7,3,2,1,5,0])
print("a =",a)
print("b =",b)
print("a + b =",np.add(a,b))
2.subtract(a,b) 数组对应位置元素相减 等同于a-b
a = np.array([2,1,4,0,3,6])
b = np.array([7,3,2,1,5,0])
print("a =",a)
print("b =",b)
print("a - b =",np.subtract(a,b))
3.multiply(a,b) 数组对应位置元素相乘 等同于a*b
a = np.array([2,1,4,0,3,6])
b = np.array([7,3,2,1,5,0])
print("a =",a)
print("b =",b)
print("np.multiply(a,b) =",np.multiply(a,b))
print("a * b =",a*b)
4.dot(a,b) 数组点乘(向量的内积,矩阵的乘法)
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print("a =",a)
print("b =",b)
print('np.dot(a,b)=',np.dot(a,b))
print('np.multiply(a,b)=',np.multiply(a,b))
print('a * b =',a*b)
5.power(a,b) a的b次方 等同于a**b
a = np.array([2,1,4,0,3,6])
b = np.array([7,3,2,1,5,0])
print("a =",a)
print("b =",b)
print("a的b次方 =",np.power(a,b))
6.divide(a,b) 数组对应位置元素相除 等同于a/b
a = np.array([2,1,4,0,3,6])
b = np.array([7,3,2,1,5,4])
print("a =",a)
print("b =",b)
print("a/b =",np.divide(a,b))
7.floor_divide(a,b) 数组对应位置元素相除,向下圆整除法(只保留商,舍弃余数) 等同于a//b
a = np.array([2,1,4,0,3,6])
b = np.array([7,3,2,1,5,4])
print("a =",a)
print("b =",b)
print("a/b的商 =",np.floor_divide(a,b))
8.mod(a,b) 数组对应位置元素求模(求a/b的余数) 等同于a%b
a = np.array([2,1,4,0,3,6])
b = np.array([7,3,2,1,5,4])
print("a =",a)
print("b =",b)
print("a%b =",np.mod(a,b))
9.maximum(a,b) 最大值 fmax(a,b)忽略NaN
a = np.array([2,1,4,0,3,np.nan])
b = np.array([7,3,2,1,5,4])
print("a =",a)
print("b =",b)
print("a与b对应位置的最大值 =",np.maximum(a,b)) #输出a与b对应位置的最大值 = [ 7. 3. 4. 1. 5. nan]
print("a与b对应位置的最大值 =",np.fmax(a,b)) #输出a与b对应位置的最大值 = [7. 3. 4. 1. 5. 4.]
10.minimum(a,b) 最小值 fmin(a,b)忽略NaN
a = np.array([2,1,4,0,3,np.nan])
b = np.array([7,3,2,1,5,4])
print("a =",a)
print("b =",b)
print("a与b对应位置的最小值 =",np.minimum(a,b)) #输出a与b对应位置的最小值 = [ 2. 1. 2. 0. 3. nan]
print("a与b对应位置的最小值 =",np.fmin(a,b)) #输出a与b对应位置的最小值 = [2. 1. 2. 0. 3. 4.]
七、数学统计方法
1.sum() 求和
a = np.arange(10) #生成一个从0开始到10结束(不包括结束值),步长为1的数列
print("a =",a)
print("a各元素的和是",np.sum(a))
2.cumsum() 求前缀和
a = np.arange(10) #生成一个从0开始到10结束(不包括结束值),步长为1的数列
print("a =",a)
print("a各元素的累加和是",np.cumsum(a)) #从数组索引号0开始到该位置为止(包括该位置)所有元素的和
3.mean() 求平均数
a = np.arange(10) #生成一个从0开始到10结束(不包括结束值),步长为1的数列
print("a =",a)
print("a各元素的平均数是",np.mean(a))
4.std() 求标准差
a = np.arange(10) #生成一个从0开始到10结束(不包括结束值),步长为1的数列
print("a =",a)
print("a各元素的标准差是",np.std(a))
5.var() 求方差
a = np.arange(10) #生成一个从0开始到10结束(不包括结束值),步长为1的数列
print("a =",a)
print("a各元素的方差是",np.var(a))
6.min() 求最小值
a = np.array([2,4,-7,1,0,-5,9])
print("a =",a)
print("a最小元素的值是",np.min(a))
a = np.array([[2,4],[-7,1],[0,-5]])
print("a =",a)
print("a各列最小元素的值分别是",np.min(a,axis=0))
print("a各行最小元素的值分别是",np.min(a,axis=1))
7.max() 求最大值
a = np.array([2,4,-7,1,0,-5,9])
print("a =",a)
print("a最大元素的值是",np.max(a))
a = np.array([[2,4],[-7,1],[0,-5]])
print("a =",a)
print("a各列最大元素的值分别是",np.max(a,axis=0))
print("a各行最大元素的值分别是",np.max(a,axis=1))
8.argmin() 求最小值索引
a = np.array([2,4,-7,1,0,-5,9])
print("a =",a)
print("a最小元素的索引是",np.argmin(a))
9.argmax() 求最大值索引
a = np.array([2,4,-7,1,0,-5,9])
print("a =",a)
print("a最大元素的索引是",np.argmax(a))
八、随机数
1.rand 返回给定维度的随机数组(0到1之间的数)
2.randn 返回给定维度的随机数组
3.randint 返回给定区间的随机整数
4.standard_normal 生成正态分布的随机样本数
a = np.random.rand(2,2,2) #生成形状为(2,2,2)的随机数组,随机数在0到1之间
b = np.random.randn(2,2,2) #生成形状为(2,2,2)的随机数组
c = np.random.randint(3,8) #生成[3,8)区间的随机数
d = np.random.standard_normal([2,3]) #生成形状为(2,3)的正态分布的随机样本数组
print("a =",a)
print("b =",b)
print("c =",c)
print("d =",d)
九、矩阵matlib
NumPy包中包含一个Matrix库 numpy.matlib
import numpy.matlib
import numpy as np
1.asmatrix(data, dtype=None)将输入解释为矩阵
如果输入已经是矩阵或ndarray,则不进行复制,而是构造视图
A = np.array([[1, 2], [3, 4]])
B = np.asmatrix(A) #B不是A的复制版本,而是
print("A =",A)
print("B =",B)
A[0,0] = 5
print("B =",B)
2.repmat(a, m, n)复制矩阵
a:要重复的数组或矩阵
m, n:沿第一和第二轴重复的次数
A = np.asmatrix(np.arange(6).reshape(2, 3))
B = np.matlib.repmat(A, 2, 3)
print("A =",A)
print("B =",B)
十、常用函数
all(a, axis=None, out=None, keepdims=, *, where=, casting=‘same_kind’)
a: 输入数组或数据框。
axis: 可选参数,指定在哪个维度上判断。如果未指定,则检查数组中的所有元素。
out: 可选参数,用于指定输出结果的位置。
keepdims: 可选参数,如果设置为True,则保持输出结果的维度与输入数组一致。
where: 可选参数,用于指定条件。
casting: 可选参数,用于控制类型转换。
判断数组中的所有元素是否都大于0
a = np.array([1, 2, 3, 4])
result = np.all(a > 0)
print(result)
判断二维数组中的每一行是否都大于0
a = np.array([[-1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = np.all(a > 0, axis=1)
print(result)
参考
NumPy: the absolute basics for beginners
NumPy quickstart
Numpy的介绍与基本使用方法
numpy创建array【老鱼学numpy】
Numpy 数组索引的实现
Numpy数组索引和切片
Python点阵图关联强弱性 python矩阵点乘和叉乘
Numpy基础(01)–数组简介
Numpy基础(02)–基础操作
Numpy基础(03)–通用计算
numpy数组的拼接
numpy数组 拼接
Python常用函数】一文让你彻底掌握Python中的numpy.all函数
展平数组(flatten、ravel)——numpy