Numpy
最全介绍!!!建议收藏!!!(一)
写在前面:
Numpy
包提供了大量的库函数和操作,其内置的库函数比python内置函数要快许多,这也是为什么numpy
会大量用于数据分析和机器学习领域。同时,在学习过程中要善于使用help()函数来学习一种函数的具体使用方法
安装:
在cmd
中通过pip install numpy
安装。
数组:
numpy
中数组的使用和python中的列表十分相似。但又与之有所不同
-
numpy
中的数组import numpy as np # python中的列表中的元素可以是不同数据类型的 a = [1, 2.3, '4'] print(a) # numpy中的数组的数据类型一定是全部相同的 b = np.array([4, 5, 6.0]) print(b) # # [1, 2.3, '4'] # [4. 5. 6.]
-
创建数组
import numpy as np # 1. 使用np.array来创建数组 a = np.array([1, 2, 3, 4]) print(a) # [1 2 3 4] # 2. 使用np.arange创建数组 b = np.arange(0, 10, 2) print(b) # 在0,10(不包含10,)范围内创建步长为2的一维数组 # [0 2 4 6 8] # # 使用help函数查看np.arange() # help(np.arange) # 3.使用np.random.random来随机创建一个m行n列的数组,其中里面的值是0~1之间的随机数 c = np.random.random((2, 3)) print(c) # [[0.37130822 0.3524612 0.97197089] # [0.43064737 0.53399519 0.26157308]] # 4.np.random.randint来随机创建一个m行n列的整形数组,其中里面的值的范围是0~10(不包含10,) d = np.random.randint(0, 10, size=(2, 3)) print(d) # [[5 1 6] # [5 2 1]] # 5.特殊函数 # 1.生成所有元素都是0的3行3列的二维数组 a1 = np.zeros((3, 3)) print(a1) # 2.生成值全为1的3行3列的矩阵 a2 = np.ones((3, 3)) print(a2) # 3.生成值全部为9的2行3列的矩阵 a3 = np.full((2, 3), 9) print(a3) # 4.生成对角线上全是1,其余地方全是0的矩阵 a4 = np.eye(4) print(a4) # [[1. 0. 0. 0.] # [0. 1. 0. 0.] # [0. 0. 1. 0.] # [0. 0. 0. 1.]]
-
ndarray
常用属性-
array.dtype
numpy
中数组只能储存一种数据类型,因此可以通过array.dtype
获取数组中的元素的数据类型。numpy
中的数据类型非常多,这使得它能够以尽量少的空间处理大量的数据。下面列出了array.dtype
中常用的数据类型数据类型 描述 唯一标识符 bool 用一个字节存储的布尔类型(True或False) ‘b’ int8 一个字节大小,-128 至 127 ‘i1’ int16 整数,16 位整数(-32768 ~ 32767) ‘i2’ int32 整数,32 位整数(-2147483648 ~ 2147483647) ‘i4’ int64 整数,64 位整数(-9223372036854775808 ~ 9223372036854775807) ‘i8’ uint8 无符号整数,0 至 255 ‘u1’ uint16 无符号整数,0 至 65535 ‘u2’ uint32 无符号整数,0 至 2 ** 32 - 1 ‘u4’ uint64 无符号整数,0 至 2 ** 64 - 1 ‘u8’ float16 半精度浮点数:16位,正负号1位,指数5位,精度10位 ‘f2’ float32 单精度浮点数:32位,正负号1位,指数8位,精度23位 ‘f4’ float64 双精度浮点数:64位,正负号1位,指数11位,精度52位 ‘f8’ complex64 复数,分别用两个32位浮点数表示实部和虚部 ‘c8’ complex128 复数,分别用两个64位浮点数表示实部和虚部 ‘c16’ object_ python对象 ‘O’ string_ 字符串 ‘S’ unicode_ unicode类型 ‘U’ import numpy as np # 1.默认的数据类型 a1 = np.arange(10) print(a1) print(a1.dtype) # [0 1 2 3 4 5 6 7 8 9] # int32 # windows系统默认是int32,mac或者linux根据实际系统判断 # 2.指定dtype b = np.array([1, 2, 3, 4, 5], dtype='i1') # b=np.array([1,2,3,4,5],dtype=np.int8) print(b) print(b.dtype) # [1 2 3 4 5] # int8 # 3.修改dtype a2 = a1.astype(np.int64) print(a2) print(a2.dtype) # [0 1 2 3 4 5 6 7 8 9] # int64 # astype不会修改数组本身而是将修改后的结果返回
-
ndarray.size
获取数组中总的元素个数。
import numpy as np #获取二维数组a中的元素个数 a = np.array([[1, 2, 3], [4, 5, 6]]) print(a.size)
-
ndarray.ndim
获取数组的维度
import numpy as np a1=np.array([1,2,3])#一维 print(a1.ndim) a2=np.array([[1,2,3],[4,5,6]]) print(a2.ndim)#二维 a3=np.array([ [ [1,1,1], [2,2,2] ], [ [3,3,3], [4,4,4] ] ]) print(a3.ndim)#三维 # 1 # 2 # 3
-
ndarray.shape
获取数组维度的元组
import numpy as np a1 = np.array([1, 2, 3]) print(a1.shape) a2 = np.array([[1, 2, 3], [4, 5, 6]]) print(a2.shape) a3 = np.array([ [ [1, 1, 1], [2, 2, 2] ], [ [3, 3, 3], [4, 4, 4] ] ]) print(a3.shape) # (3,) # (2, 3) # (2, 2, 3) # #
使用
reshape
重新修改数组的维度import numpy as np a1 = np.array([1, 2, 3]) a2 = np.array([[1, 2, 3], [4, 5, 6]]) a3 = np.array([ [ [1, 1, 1], [2, 2, 2] ], [ [3, 3, 3], [4, 4, 4] ] ]) # 将a3修改成2行6列的二维数组,并拷贝到a4 a4 = a3.reshape((2, 6)) print(a4) print(a4.shape) # a5 = a3.reshape((1, 12)) # a5 = a3.reshape((12)) a5 = a3.flatten() # 使用flatten函数快速将多维数组以行排序转换到一维数组 print(a5) print(a5.ndim) # reshape将修改后的结果返回,并不会改变原来的数组。而resize可以修改原来的数组
-
ndarray.itemsize
获取数组中每个元素所占的字节数
import numpy as np a = np.array([1, 2, 3], dtype=np.int64) print(a.itemsize) # 8
-
-
Numpy
数组操作-
数组索引和切片
import numpy as np # 1、一维数组的索引和切片 a1 = np.arange(10) print(a1[4]) # 4 # 获取下标为4的元素 print(a1[4:6]) # [4 5] # 切片:取从下标为4开始的元素到下标为6的元素(不包含6) print(a1[::2]) # [0 2 4 6 8] # 在所有范围内以步长为2取元素值 print(a1[-1]) # 9 # 取倒数第一个数 print("+++++++++++++++++++++++++++++++++++++") # 多维数组 a2 = np.random.randint(0, 10, size=(4, 6)) print(a2) # [[2 1 1 1 6 0] # [8 9 5 4 8 8] # [4 3 6 1 7 2] # [7 3 2 9 2 0]] print("+++++++++++++++++++++++++++++++++++++") print(a2[0]) # 取下标为0的行 # [2 1 1 1 6 0] print(a2[0:2]) # 取下标为0,1的行 # [[2 1 1 1 6 0] # [8 9 5 4 8 8]] print(a2[[0, 2, 3]]) # 取下标为0,2,3的行组成新的矩阵 # [[2 1 1 1 6 0] # [4 3 6 1 7 2] # [7 3 2 9 2 0]] print(a2[[1, 2], [4, 5]]) # 取下标为(1,4)、(2,5)的元素值 # [8 2] print(a2[1:3, 4:6]) # 取第2、3行和第5、6列重叠的元素 # [[8 8] # [7 2]]
一般来说,数组索引中逗号前面的元素范围就是行的范围,逗号后面的元素范围就是列的范围
-
布尔索引
import numpy as np a1=np.arange(24).reshape((4,6)) print(a1) #把a1中元素小于10的找出来并置为True,否则置为False print(a1<10) #取a1中小于10的元素并置为一维数组 print(a1[a1<10]) # 取a1中小于5或大于10的元素并置为一维数组 print(a1[(a1<5)|(a1>10)])
-
值的替换
import numpy as np a1 = np.random.randint(0, 10, size=(3, 5)) print(a1) # 将行下标为1的行替换 a1[1] = np.array([1, 2, 3, 4, 5]) print(a1) # 将数组中元素小于3的数置为1 a1[a1 < 3] = 1 print(a1) #将a3中大于3的元素置为0,否则置为1 a2 = np.where(a1 < 3, 0, 1) print(a2)
例题:有一个8行9列的数组,请将其中1-5行(包含第5行)的第8列大于3的数全部都取出来。
import numpy as np b = np.random.randint(0, 10, size=(8, 9)) print(b) # 先获取指定部分的数据条件的数组 conditions = b[1:6, 8] > 3 print(conditions) # 再获取指定部分的数据 datas = b[1:6, 8] print(datas) # 再从数组中提取符合条件的数据 ans = datas[conditions] print(ans)
-
-
数组的广播机制
import numpy as np a1 = np.random.randint(0, 5, size=(3, 5)) print(a1) # 将a1中每个元素值都*2 print(a1 * 2) a2 = np.random.randint(0, 5, size=(3, 5)) # 将a1,a2各个元素对应相加 # 注意:只有行数和列数分别相等的两个矩阵才能进行加减运算 print(a1 + a2) # 将列向量a3加到a1的第一列 a3 = np.random.randint(0, 5, size=(3, 1)) print(a3 + a1) # 将行向量a4加到a1的第一行 a4 = np.random.randint(0, 5, size=(1, 5)) print(a4 + a1) #广播原则: # 如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为他们是广播兼容的。 a5 = np.random.randint(0, 5, size=(3, 8, 2)) a6 = np.random.randint(0, 5, size=(8, 2)) print(a5) print("++++++++++++++++++++++++++++++++++") print(a6) print("++++++++++++++++++++++++++++++++++") print(a6 + a5)
-
数组形状的操作
flatten
和ravel
函数:import numpy as np a1 = np.random.randint(0, 10, size=(3, 4)).reshape((2, 6)) print(a1) a1.resize((4, 3)) print(a1) # flatten和ravel函数 a2 = np.random.randint(0, 10, size=(3, 4)) print(a2) #flatten是将数组转换为一维数组后,然后将这个拷贝返回回去,所以后续对这个返回值进行修改不会影响之前的数组。 a3=a2.flatten() a3[0]=100 print(a2[0,0]) #8 # ravel是将数组转换为一维数组后,将这个视图(可以理解为引用)返回回去,所以后续对这个返回值进行修改会影响之前的数组。 a4=a2.ravel() a4[0]=100 print(a2[0,0]) #100
不同数组的组合:通过
vstack
和hstack
以及concatenate
将多个数组叠加到一起import numpy as np #np.vstack将两个列数相同的数组按照垂直方向进行叠加 vstack1=np.random.randint(0,10,size=(3,4)) vstack2 = np.random.randint(0,10,size=(2,4)) # vstack3=np.vstack([vstack1,vstack2]) vstack3=np.concatenate([vstack1,vstack2],axis=0)#这里的axis将在之后讲到 print(vstack3) print("="*30) #np.hstack将两个行数相同的数组按照水平方向进行叠加 h1=np.random.randint(0,10,size=(3,4)) h2=np.random.randint(0,10,size=(3,1)) # h3=np.hstack([h1,h2]) h3=np.concatenate([h1,h2],axis=1) print(h3)
数组的切割:通过
hsplit
和vsplit
以及split
将一个数组进行切割。import numpy as np sp1 = np.random.randint(0, 10, size=(3, 4)) print(sp1) # [[9 9 8 7] # [6 5 4 5] # [1 7 4 3]] # 将sp1数组按照竖直方形进行切割,切成两部分,在水平方向上形成2个数组 print(np.hsplit(sp1, 2)) # [array([[9, 9], # [6, 5], # [1, 7]]), array([[8, 7], # [4, 5], # [4, 3]])] # 在下标为1和2的那一列前面切一刀,形成3个数组 print(np.hsplit(sp1,(1,2))) # [array([[9], # [6], # [1]]), array([[9], # [5], # [7]]), array([[8, 7], # [4, 5], # [4, 3]])] print("=*"*30) vs1 = np.random.randint(0,10,size=(4,5)) print(vs1) # [[7 8 8 0 9] # [9 7 9 6 2] # [4 3 5 1 5] # [7 9 0 0 4]] print(np.vsplit(vs1,4)) # [array([[7, 8, 8, 0, 9]]), array([[9, 7, 9, 6, 2]]), array([[4, 3, 5, 1, 5]]), array([[7, 9, 0, 0, 4]])] print(np.vsplit(vs1,(1,3))) # [array([[7, 8, 8, 0, 9]]), array([[9, 7, 9, 6, 2], # [4, 3, 5, 1, 5]]), array([[7, 9, 0, 0, 4]])] #使用split函数进行切割 print(np.split(sp1,4,axis=1)) #axis=1表示按列进行切割,axis=0表示按行进行切割 print(np.split(vs1,4,axis=0))
-
矩阵转置和轴对换
import numpy as np t1=np.random.randint(0,10,size=(2,4)) print(t1) #t1的转置,不会影响到原来数组 print(t1.T) #此外,还可以使用transpose方法进行转置,不过transpose会影响到原来的数组 t2=t1.transpose() t2[0]=100 print(t1) #求矩阵内积 print(t1.dot(t1.T))
写在最后。。。。。。
你们的鼓励是我输出的动力,这是Numpy
的数组操作,在我主页还有Numpy
的文件操作,赶快点赞收藏吧!!