Numpy库是Python进行科学计算的基础库,它是一个由多维数组对象组成,包含数学运算、逻辑运算、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等功能。
说明文档:NumPy 介绍 | NumPy 中文
1.数组的创建
import numpy as np # 1.数组的创建 a=np.array([1,2,3],dtype=int) #创建一维数组,可指定元素类型 b=np.array([[1,2,3],[4,5,6]]) #创建二维数组 print(a)# [1 2 3] print(b) # [[1 2 3] # [4 5 6]] a=np.arange(10)#默认从0开始 print(a)#[0 1 2 3 4 5 6 7 8 9] a=np.arange(1,10)#左闭右开区间 print(a)#[1 2 3 4 5 6 7 8 9] a=np.arange(1,10,2)#指定步幅为2 print(a)#[1 3 5 7 9] a=np.linspace(1, 2, 5)#指定起止值,创建指定个数的等差一维数组 print(a)#[1. 1.25 1.5 1.75 2. ] a = np.zeros(3) #创建一个只包含0的数组,列数为3,行数缺省为1 a=np.zeros((2,3))#创建一个m行n列的全0数组 print(a) # [[0. 0. 0.] # [0. 0. 0.]] a=np.ones((2,3))#创建一个m行n列的全1数组 print(a) # [[1. 1. 1.] # [1. 1. 1.]] z = np.empty(4) #在内存中创建一个空数组,以备之后填入数据。 print(z) #[2.95792101e-272 1.02380627e-306 3.96786093e-301 8.71907139e-301] 好像是随机创建的内容,没用 z = np.identity(2)#使用np.identity或者np.eye函数,创建单位矩阵 print(z) # [[1. 0.] # [0. 1.]] # 使用np.array函数,Python的列表,元组等也能转换为Numpy数组 a = np.array([10, 20]) # 使用列表构建数组 print(a)#[10 20] b = np.array((10, 20), dtype=float) # 使用元组构建数组 print(b)#[10. 20.] c = np.array([[1, 2], [3, 4]]) # 使用列表嵌套列表构建数组 print(c) # [[1 2] # [3 4]] # np.random.rand(m,n)或者np.random.random((m,n) # 创建m行n列,由0-1的随机数构成的数组,注意后者传入的参数是一个元组 a=np.random.rand(2,3)#(3)也可以,行数缺省为1 print(a) a=np.random.random((2,3))#((3))也可以,行数缺省为1 print(a) # [[0.39640904 0.70625911 0.41037923] # [0.65263409 0.63491374 0.66204204]] a = np.random.randint(0,3,(2,3)) #创建2行3列的二维数组,范围在[0-3)之间 print(a) a=np.random.rand(2,3,4)#3维矩阵 print(a) # [[[0.11838695 0.22200378 0.71420386 0.50389581] # [0.3725528 0.28242966 0.31213826 0.05534031] # [0.53484771 0.69017367 0.67676519 0.17627573]] # # [[0.65290297 0.8464174 0.76181375 0.98847299] # [0.91528719 0.61851361 0.90388327 0.30164545] # [0.52912919 0.86626941 0.25378109 0.83821525]]] a=np.indices((2,3,4))#np.indices的作用就是返回一个给定形状数组的序号网格数组,可以用于提取数组元素或对数组进行切片使用。 print(a) # [[[[0 0 0 0] # [0 0 0 0] # [0 0 0 0]] # # [[1 1 1 1] # [1 1 1 1] # [1 1 1 1]]] # # # [[[0 0 0 0] # [1 1 1 1] # [2 2 2 2]] # # [[0 0 0 0] # [1 1 1 1] # [2 2 2 2]]] # # # [[[0 1 2 3] # [0 1 2 3] # [0 1 2 3]] # # [[0 1 2 3] # [0 1 2 3] # [0 1 2 3]]]] print(a.shape)#(3, 2, 3, 4) 第一个3是indices中参数的个数,后面的对应indices中的参数
2.数组的堆叠和拆分
import numpy as np #2.数组的堆叠和拆分 a=np.array([0,1,2,3])#单独的[0,1,2,3]是列表 b=np.array([10,11,12,13]) c=np.vstack((a,b))#行堆叠,a和b数组的个数要一样 print(c) # [[ 0 1 2 3] # [10 11 12 13]] a=np.array([0,1,2,3]) b=np.array([10,11,12]) c=np.hstack((a,b))#列堆叠,a和b数组的个数可以不一样 print(c)#[ 0 1 2 3 10 11 12] # 拆分 a=np.array([[0,1,2], [3,4,5], [6,7,8]]) b=np.vsplit(a,3)#按行拆分成3等分 print(b)#[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])] b,c,d=np.vsplit(a,3) print(c)#[[3 4 5]] b=np.vsplit(a,(2,)) #从第2行后面进行拆分 print(b) # [array([[0, 1, 2], # [3, 4, 5]]), array([[6, 7, 8]])] b,c=np.vsplit(a,(2,)) print(b) # [[0 1 2] # [3 4 5]] b=np.hsplit(a,3) #按列拆分成3等 print(b) # [array([[0], # [3], # [6]]), array([[1], # [4], # [7]]), array([[2], # [5], # [8]])] a=np.array([[0,1,2,10], [3,4,5,10], [6,7,8,10]]) b=np.hsplit(a,(1,3)) #分别从第二列和第3列后进行拆 print(b) # [array([[0], # [3], # [6]]), array([[1, 2], # [4, 5], # [7, 8]]), array([[10], # [10], # [10]])]
3.运算
import numpy as np # 3.运算 a = np.array([1,2,7,8]) b = np.array([5,6,3,2]) print(a + 10)# 对每个元素添加一个标量:[11 12 17 18] print(a * 10)# 对每个元素乘一个标量:[10 20 70 80] print(a+b)#[ 6 8 10 10] print(a-b)#[-4 -4 4 6] print(a*b)#[ 5 12 21 16] print(a/b)#[0.2 0.33333333 2.33333333 4. ] print(a//b)#除后结果向下取整:[0 0 2 4] print(a%b)#[1 2 1 0] print(a**b)#代表乘方:[ 1 64 343 64] # 比较运算:==,<,<=,>,>=,!= 数组中每个元素都进行相应比较,返回bool值组成的数组 print(a==2)#[False True False False] # 逻辑运算:逻辑与(&),逻辑或(|) print((a>3)&(a<10))#[False False True True] print(a @ b)# 两个矩阵相乘:54
4.索引和切片
import numpy as np #4.索引和切片 #一维数组 a = np.arange(10) print(a)#[0 1 2 3 4 5 6 7 8 9] print(a[0])#0 print(a[-1])#索引倒数第i个元素:9 print(a[0:8])#x[m:n],m到n-1的数据:[0 1 2 3 4 5 6 7] print(a[0:8:2])#指定步幅为i:[0 2 4 6] # 多维数组 z = np.array([[1, 2], [3, 4]]) print(z) # [[1 2] # [3 4]] print(z[0])#第一行:[1 2] print(z[0, :])#第一行:[1 2] print(z[:, 1])#第二列:[2 4] print(z[0:2, 0])#前2行第1个数:[1 3] print(z[0,0])#第1行第1个数:1 #索引数组 #单个索引数组 a = np.linspace(2,20,10,dtype=int) print(a)#[ 2 4 6 8 10 12 14 16 18 20] print(a[[1,2,3,4]])##传入列表索引和一维数组索引等效:[ 4 6 8 10] print(a[np.array([1,2,3,4])])# #索引数组为一维数组:[ 4 6 8 10] print(a[np.array([[1,2],[3,4]])]) ##索引数组为二维数组:[[1,2],[3,4]],那么x[[[1,2],[3,4]]] 结果为[[x[1],x[2]],[x[3],x[4]]] # [[ 4 6] # [ 8 10]] a=np.array([[1,2],[3,4]]) b=np.array([[1,1],[0,1]]) print(a[b])#[[第2行,第2行],[第1行,第2行]] # [[[3 4] # [3 4]] # # [[1 2] # [3 4]]] # 多个索引数组: 为多个维度提供索引,每个维度的索引数组必须具有相同的形状。 a = np.arange(16).reshape(4,4) i = np.array([[0,1],[2,3]]) j = np.array([[2,1],[3,3]]) print(a) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11] # [12 13 14 15]] print(a[i,:])#[[第1行,第2行][第3行,第4行]] # [[[ 0 1 2 3] # [ 4 5 6 7]] # # [[ 8 9 10 11] # [12 13 14 15]]] print(a[i,[2]])#[[第1行第3个,第2行第3个][第3行第3个,第4行第3个]] # [[ 2 6] # [10 14]] print(a[i,[2,1]])#[[第1行第3个,第2行第2个][第3行第3个,第4行第2个]] # [[ 2 5] # [10 13]] print(a[i,j])#[[第1行第3个,第2行第2个][第3行第4个,第4行第4个]] # [[ 2 5] # [11 15]] # print(a[np.array([[0,1],[2,3]]),np.array([[2,1],[3,3]])]) #从输出结果中可以看出,其实就是第1个array和第2个array中一一对应的 # [[a[0][2],a[1][1]] # [a[2][3],a[3][3]]] a = np.indices((2,3)) #创建一个3维数组 print(a) # [[[0 0 0] # [1 1 1]] # # [[0 1 2] # [0 1 2]]] print(a[np.array([0,1]),np.array([0,1])] )#对前两个维度进行索引,结果相当于np.array([a[0][0],a[1][1]]) # [[0 0 0] # [0 1 2]] print(a[np.array([0,1]),np.array([0,1]),np.array([1,2])] )#对3个维度分别索引,结果相当于np.array(a[0][0][1],a[1][1][2]) # [0 2] #索引数组和整数相结合:将整数理解为和索引数组等长的以该整数为元素的数组 a = np.array([[1,2,3],[2,3,4],[3,4,5]]) print(a) # [[1 2 3] # [2 3 4] # [3 4 5]] print(a[np.array([1,2]),2])#[4 5] print(a[np.array([1,2]),np.array([2,2])])#[4 5] print(a[1,np.array([1,2])])#[3 4] print(a[[1,1],np.array([1,2])])#[3 4] # 布尔索引:与原始数组具有相同形状的布尔数组:在获取元素的时候,只返回索引值为True的元素所组成的数组,其它元素舍弃 a = np.array([[1,2,3],[2,3,4],[3,4,5]]) b = a > 3 print(b) # [[False False False] # [False False True] # [False True True]] print(a[b]) #返回a中大于3的元素所组成的数组 # [4 4 5] a[b] = 0 #赋值,只对索引数组中元素为True的位置进行赋值 print(a) # [[1 2 3] # [2 3 0] # [3 0 0]] # 对于数组的每个维度,给出一个一维布尔数组以及想要的切片。 请注意,一维布尔数组的长度必须与要切片的尺寸(或轴)的长度一致 a = np.arange(15).reshape((3,5)) print(a) # [[ 0 1 2 3 4] # [ 5 6 7 8 9] # [10 11 12 13 14]] b1 = np.array([True,False,True]) b2 = np.array([True, False, True, False, True]) print(a[b1,:])# 布尔类型的数据也可用于提取元素 # [[ 0 1 2 3 4] # [10 11 12 13 14]] print(a[:,b2]) # [[ 0 2 4] # [ 5 7 9] # [10 12 14]] z=np.arange(5) d = np.array([0, 1, 1, 0, 0], dtype=bool)#也可以这样强制转换一下 print(d)#[False True True False False] print(z[d])#[1 2]
5.常用属性
import numpy as np # 5.常用属性 a = np.arange(15).reshape((3,5)) print(a) # [[ 0 1 2 3 4] # [ 5 6 7 8 9] # [10 11 12 13 14]] print(a.ndim)#数组的轴(维度)的个数:2 print(a.shape)#数组的维度,对于m行n列的矩阵数组,返回的是(m,n):(3, 5) print(a.size)#数组中所有元素的个数,等于shape的元素的乘积:15 print(a.dtype)#数组中元素类型的对象:int32 print(a.dtype.name)#数组中元素类型名称:int32 print(a.itemsize)#数组中每个元素的字节大小,比如元素类型为int64的数组,每个元素的字节大小为64/8=8个字节:4 print(a.T)#转置操作,不修改原数组: # [[ 0 5 10] # [ 1 6 11] # [ 2 7 12] # [ 3 8 13] # [ 4 9 14]] a = np.arange(15) print(type(a)) ## 常见的数据类型包括:1. float64: 64 位浮点型数字,2. int64: 64 位整数型数字,3. bool: 8 位 True 或者 False。通常来说,默认的数据类型为float64。 print(type(a[0]))# print(a.shape)#(15,)只有1行,所以只显示个数
6.常用方法
import numpy as np
#6.常用方法
a = np.arange(15) #创建一个一维数组
print(a)#[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
print(a.tolist()) #转成python列表形式 :[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
a.astype(float)#转换数组元素类型为float类型:
print(a.astype(float))#[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.]
#修改数组形状:reshape不会修改原数组,resize会修改原数组
b = a.reshape(3,5) #修改数组为3行5列的二维数组
print(b)
# [[ 0 1 2 3 4]
# [ 5 6 7 8 9]
# [10 11 12 13 14]]
print(a) #reshape后,没有修改原数组:[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
a.resize(3,5) #resize修改了原数组
print(a)
# [[ 0 1 2 3 4]
# [ 5 6 7 8 9]
# [10 11 12 13 14]]
a = np.array((4, 3, 2, 1))
print(a)
print("sort =",a.sort()) # 对数组a进行排序
print("sum =",a.sum()) # 对数组a进行求和
print("mean =",a.mean()) # 求出数组a的均值
print("max =",a.max()) # 求出数组a的最大值
print("max =",a.min()) # 求出数组a的最小值
print("argmax =",a.argmax()) # 返回最大元素的索引
print("argmax =",a.argmin()) # 返回最小元素的索引
print("cumsum =",a.cumsum()) # 对每个元素累积求和:[ 1 3 6 10]
print("cumprod =",a.cumprod()) # 对每个元素累积求积:[ 1 2 6 24]
print("var =",a.var()) # 求数组a的方差
print("std =", a.std()) # 求数组a的标准差
a.shape = (2, 2)#a=a.reshape(2,2)
print(a)
# [[1 2]
# [3 4]]
print(a.max(axis=1)) # axis=1,按行求最大(小)值 [2 4]
print(a.max(axis=0)) # axis=0,按列求最大(小)值 [3 4]
print(a.argmax(axis=1))# axis=1,按行求最大(小)值所对应的索引值 [1 1]
print(a.argmax(axis=0))# axis=1,按列求最大(小)值所对应的索引值 [1 1]
#将数组降维成一维数组:ravel和flatten都不会修改原数组
b=a.ravel() #降维成一维数组:[1 2 3 4]
b=a.flatten() #降维成一维数组:#ravel()和flatten()都没有修改原数组
print(b)#[1 2 3 4]
# Numpy数组中也存在深拷贝和浅拷贝的区别:
# 深拷贝即再内存中新建一个数据副本,两个数组内存地址不同,可以分别修改,浅拷贝即不在内存中新建地址,仅仅引用之前的地址,两个数组内存地址相同,只能同时修改
c = np.copy(b) # 深拷贝
c[0] = 0
print(b)#[1 2 3 4]
print(c)#[0 2 3 4]
c = b # 浅拷贝
c = b.view()# 浅拷贝
c[0] = 0
print(b)#[0 2 3 4]



