import numpy as np """ 定义数组的常用方法array,arange,linspace,logspace,ogrid,mgrid等 """ #传入array的对象可以但个数,也可以是列表 np.array([1,2,4,5]) Out[3]: array([1, 2, 4, 5]) # array的另一个参数dtype用来制定列表数据类型,np.int整型,np.complex复数 np.array([[1,2,3],[4,5,6]],dtype = np.int) Out[4]: array([[1, 2, 3], [4, 5, 6]]) # arange的三个参数是(始值,终值,步长) np.arange(10,20,2) Out[5]: array([10, 12, 14, 16, 18]) # linspace生成等差数组,参数是(始值,终值,个数,是否包含终值,元素类型) np.linspace(0,100,50,endpoint= False,dtype= np.int) Out[6]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]) # logspace生成等比数列,参数分别为(始值,终值,个数,对数的底,类型) np.logspace(1,2,10,endpoint= False,base= 10.0,dtype= None) Out[7]: array([ 10. , 12.58925412, 15.84893192, 19.95262315, 25.11886432, 31.6227766 , 39.81071706, 50.11872336, 63.09573445, 79.43282347]) # 按函数方式生成数组 def func(i, j): return (i+ 1)*(j+ 1) np.fromfunction(func,(9,9)) Out[8]: array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9.], [ 2., 4., 6., 8., 10., 12., 14., 16., 18.], [ 3., 6., 9., 12., 15., 18., 21., 24., 27.], [ 4., 8., 12., 16., 20., 24., 28., 32., 36.], [ 5., 10., 15., 20., 25., 30., 35., 40., 45.], [ 6., 12., 18., 24., 30., 36., 42., 48., 54.], [ 7., 14., 21., 28., 35., 42., 49., 56., 63.], [ 8., 16., 24., 32., 40., 48., 56., 64., 72.], [ 9., 18., 27., 36., 45., 54., 63., 72., 81.]]) # 读取二进制文件 np.fromfile('二进制文件路径') # 通过正则表达式regexp比配文件file中的内容,返回匹配的数组 file = open(r'C:\Users\amtsing\Desktop\备份\个人文档\居民消费.csv') import re reg = re.compile('%d') np.fromregex(file= file,regexp= reg,dtype= None) Out[9]: array([], dtype=float64) # 同时生成列行数组 x, y = np.ogrid[0:5:2, 1:6:2] x Out[10]: array([[0], [2], [4]]) y Out[11]: array([[1, 3, 5]]) x + y Out[12]: array([[1, 3, 5], [3, 5, 7], [5, 7, 9]]) # 同时生成多行、多列矩阵 a, b = np.mgrid[0:5:2, 1:6:2] a Out[13]: array([[0, 0, 0], [2, 2, 2], [4, 4, 4]]) b Out[14]: array([[1, 3, 5], [1, 3, 5], [1, 3, 5]]) a + b Out[15]: array([[1, 3, 5], [3, 5, 7], [5, 7, 9]]) # 获取矩阵属性,shape大小,dtype类型,n.dim维数,T转置, base基础元素 c = a+ b c.shape, c.dtype, c.ndim, c.T, c.base Out[16]: ((3, 3), dtype('int32'), 2, array([[1, 3, 5], [3, 5, 7], [5, 7, 9]])) array([1,2,3,4,5,6,7,8,9]) # 改变数组大小用reshape c, c.reshape(9,-1) Out[17]: (array([[1, 3, 5], [3, 5, 7], [5, 7, 9]]), array([[1], [3], [5], [3], [5], [7], [5], [7], [9]])) # 或者是直接用shape改变大小 c.shape = 3,-1 c Out[18]: array([[1, 3, 5], [3, 5, 7], [5, 7, 9]]) # 对数组reshape后再传入array生成多维数组 np.array(np.arange(1,10).reshape(3,3)) Out[19]: array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # resize能裁剪数组,有两个参数,一个是数组,另一个是new_shape a = np.arange(9).reshape(3, 3) np.resize(a, new_shape= (3,1)) Out[19]: array([[0], [1], [2]]) # 更改元素属性 a.astype(np.float) Out[19]: array([ 0., 1., 2.]) # 对数组做如下处理:返回排序后的数组集合, # return_index是否返回索引位置, # return_inverse是否返回逆序 # return_counts是否返回累计值 np.unique(ar= [2,2,4,1,3,5,1,3,2], return_index= True, return_inverse= True, return_counts= True,axis= None) Out[20]: (array([1, 2, 3, 4, 5]), array([3, 0, 4, 2, 5], dtype=int64), array([1, 1, 3, 0, 2, 4, 0, 2, 1], dtype=int64), array([2, 3, 2, 1, 1], dtype=int64)) # 生成索引排序数组,可以快速找到最小值和最大值的位置,比如例子中最小值在位置2,最大值在位置5 np.argsort([2,2,4,1,3,5,1,3,2],axis= -1,kind= 'quicksort') Out[21]: array([3, 6, 0, 1, 8, 4, 7, 2, 5], dtype=int64) # 矩阵叠加,参数为((arrays),轴),所有的传入数组大小要相同 np.stack(([4,3,2],[1,2,3]),axis= 0) Out[22]: array([[4, 3, 2], [1, 2, 3]]) np.concatenate(([4,3,2],[1,2,3]),axis= 0) Out[23]: array([4, 3, 2, 1, 2, 3]) # 行叠加、列叠加和交叠加 np.hstack(([4,3,2],[1,2,3])) Out[24]: array([4, 3, 2, 1, 2, 3]) np.vstack(([4,3,2],[1,2,3])) Out[25]: array([[4, 3, 2], [1, 2, 3]]) np.dstack(([4,3,2],[1,2,3])) Out[26]: array([[[4, 1], [3, 2], [2, 3]]]) # 数组拆分,indices_or_sections表示切分位置 np.split([1,2,3,4,5,6],indices_or_sections= (3,6),axis= 0) Out[27]: [array([1, 2, 3]), array([4, 5, 6]), array([], dtype=int32)] np.hsplit(np.arange(1,9),indices_or_sections= (2,4)) Out[28]: [array([1, 2]), array([3, 4]), array([5, 6, 7, 8])] np.vsplit(np.arange(1,9).reshape(8,-1),indices_or_sections= (2,4)) Out[29]: [array([[1], [2]]), array([[3], [4]]), array([[5], [6], [7], [8]])] # dsplit必须传入三维数组 np.dsplit(np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]). reshape(2, 2, -1), indices_or_sections=(2, 4, 6)) Out[30]: [array([[[1, 2], [4, 5]], [[7, 8], [10, 11]]]), array([[[3], [6]], [[9], [12]]]), array([], shape=(2, 2, 0), dtype=int32), array([], shape=(2, 2, 0), dtype=int32)] # 数组倍扩。reps是重复次数,且可以传入数组 np.tile(np.arange(9).reshape(3,3),reps= 2) Out[31]: array([[0, 1, 2, 0, 1, 2], [3, 4, 5, 3, 4, 5], [6, 7, 8, 6, 7, 8]]) # 数组增广 np.append(arr=np.arange(3),values= [4,5,6],axis= 0) Out[32]: array([0, 1, 2, 4, 5, 6]) # 插入新行、列 np.insert(np.arange(9).reshape(3,3),obj= 2,values= [3,6,9],axis= 1) Out[33]: array([[0, 1, 3, 2], [3, 4, 6, 5], [6, 7, 9, 8]]) # 删除数组行或列 np.delete(np.arange(9).reshape(3,3),obj= 2,axis= 1) Out[34]: array([[0, 1], [3, 4], [6, 7]]) # 生成三角数组,k=0标准下三角矩阵,k是控制对角线上下零行的参数 np.tri(N= 3, M= 4, k= 0, dtype= None) Out[35]: array([[ 1., 0., 0., 0.], [ 1., 1., 0., 0.], [ 1., 1., 1., 0.]]) np.tri(N= 3, M= 4, k= -1, dtype= None) Out[36]: array([[ 0., 0., 0., 0.], [ 1., 0., 0., 0.], [ 1., 1., 0., 0.]]) # 生成下三角数组,m可以传入数组,也可以传入元组 np.tril(m= [1,2,3], k= 0) Out[37]: array([[1, 0, 0], [1, 2, 0], [1, 2, 3]]) np.tril(m= [[1,2,3],[4,5,6]], k= 0) Out[38]: array([[1, 0, 0], [4, 5, 0]] # 生成下三角数组 np.triu(m= [[1,2,3],[4,5,6]], k= 0) Out[39]: array([[1, 2, 3], [0, 5, 6]]) # 生成范德蒙数组,x必须是数组或序列 np.vander(x= [2,3,4], N= 3, increasing= False) Out[40]: array([[ 4, 2, 1], [ 9, 3, 1], [16, 4, 1]]) # 多维数组变一维数组,order是平坦化方式 np.ravel(np.arange(9).reshape(3,3), order= 'C') Out[41]: array([0, 1, 2, 3, 4, 5, 6, 7, 8]) # 还可以用flatten方法 np.arange(9).reshape(3,3).flatten() Out[42]: array([0, 1, 2, 3, 4, 5, 6, 7, 8]) # zeros生成全零数组,同样ones是生成全一数组,moveaxis是维度变换 x = np.zeros((2, 3, 4)) x Out[43]: array([[[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]], [[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]]) np.moveaxis(x, source= 0, destination= -1) Out[44]: array([[[ 0., 0.], [ 0., 0.], [ 0., 0.], [ 0., 0.]], [[ 0., 0.], [ 0., 0.], [ 0., 0.], [ 0., 0.]], [[ 0., 0.], [ 0., 0.], [ 0., 0.], [ 0., 0.]]]) # 轴变换,用法近似moveaxis np.rollaxis(x, axis= 1, start= 0) Out[45]: array([[[ 0., 0., 0., 0.], [ 0., 0., 0., 0.]], [[ 0., 0., 0., 0.], [ 0., 0., 0., 0.]], [[ 0., 0., 0., 0.], [ 0., 0., 0., 0.]]]) # 数组沿轴axis,转动shift个的位数 >>> x = np.arange(10) >>> np.roll(x, 2) array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7]) >>> x2 = np.reshape(x, (2,5)) >>> x2 array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> np.roll(x2, 1) array([[9, 0, 1, 2, 3], [4, 5, 6, 7, 8]]) >>> np.roll(x2, 1, axis=0) array([[5, 6, 7, 8, 9], [0, 1, 2, 3, 4]]) >>> np.roll(x2, 1, axis=1) array([[4, 0, 1, 2, 3], [9, 5, 6, 7, 8]]) # rot90,逆时针转90度,有参数(数组,旋转次数k,需要转动的轴或维度axis) >>> m = np.array([[1,2],[3,4]], int) >>> m array([[1, 2], [3, 4]]) >>> np.rot90(m) array([[2, 4], [1, 3]]) >>> np.rot90(m, 2) array([[4, 3], [2, 1]]) >>> m = np.arange(8).reshape((2,2,2)) >>> np.rot90(m, 1, (1,2)) array([[[1, 3], [0, 2]], [[5, 7], [4, 6]]]) # swapases交换两轴 a = np.arange(4).reshape(2,2) a Out[46]: array([[0, 1], [2, 3]]) np.swapaxes(a, axis1= 1, axis2 =0) Out[47]: array([[0, 2], [1, 3]]) # 生成一个像a的全一数组,同理有zeros_like a = [[1,2,3],[4,5,6]] np.ones_like(a,dtype= None,order='k') Out[48]: array([[1, 1, 1], [1, 1, 1]]) # eye可用于生成单位数组 np.eye(N= 3, M= 4, k= -1, dtype= None) Out[49]: array([[ 0., 0., 0., 0.], [ 1., 0., 0., 0.], [ 0., 1., 0., 0.]]) # 生成单位方阵 np.identity(3) Out[50]: array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) # 重复元素 a.repeat(2, axis= 0) Out[83]: array([1, 1, 2, 2, 3, 3]) """ 建立向量矩阵 """ # 方法一:用asmatrix a = np.arange(1,10).reshape(3,3) a Out[1]: array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) np.asmatrix(a,dtype= None) Out[2]: matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 方法二,用matrix或者bmat np.matrix(np.arange(0,9),dtype= None) Out[3]: matrix([[0, 1, 2, 3, 4, 5, 6, 7, 8]]) np.bmat(np.arange(0,9),ldict = None,gdict= None) Out[4]: matrix([[0, 1, 2, 3, 4, 5, 6, 7, 8]]) np.mat(np.arange(9).reshape(3,3),dtype= None) Out[5]: matrix([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) # 方法三,传入字符串 np.matrix('1, 2; 3, 4') Out[6]: matrix([[1, 2], [3, 4]]) np.matrix('1 2; 3 4') Out[7]: matrix([[1, 2], [3, 4]]) np.matrix('1,2,3,4').reshape(2,2) Out[8]: matrix([[1, 2], [3, 4]]) # 向量化 np.vectorize(np.arange(9)) Out[9]: <numpy.lib.function_base.vectorize at 0x1ac768bac88> """ 文件存取 """ # tofile,fromfile import os os.chdir("d:\\") a = np.arange(0,12) a.reshape(3,4) array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) a.tofile("a.bin") #保存至a.bin b = np.fromfile("a.bin", dtype=np.int32) #从文件中加载数组,错误的dtype会导致错误的结果 array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) b.reshape(3,4)#读取的数据将为一维数组,需要使用reshape改变其数组结构 array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) # load()和save()用Numpy专用的二进制格式保存数据,它们会自动处理元素类型和形状等信息。savez()提供了将多个数组存储至一个 # 文件的能力,调用load()方法返回的对象,可以使用数组名对各个数组进行读取。默认数组名arr_0,arr_1,arr_2...... np.save("a.npy", a.reshape(3,4)) c = np.load("a.npy") c array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) a = np.array([[1,2,3],[4,5,6]]) b = np.arange(0,1.0,0.1) c = np.sin(b) np.savez("result.npz", a, b, sin_arr=c) #使用sin_arr命名数组c r = np.load("result.npz") #加载一次即可 r["arr_0"] array([[1, 2, 3], [4, 5, 6]]) r["arr_1"] array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) r["sin_arr"] array([ 0. , 0.09983342, 0.19866933, 0.29552021, 0.38941834, 0.47942554, 0.56464247, 0.64421769, 0.71735609, 0.78332691]) # savetxt() & loadtxt() a = np.arange(0,12,0.5).reshape(4,-1) a array([[ 0. , 0.5, 1. , 1.5, 2. , 2.5], [ 3. , 3.5, 4. , 4.5, 5. , 5.5], [ 6. , 6.5, 7. , 7.5, 8. , 8.5], [ 9. , 9.5, 10. , 10.5, 11. , 11.5]]) np.savetxt("a.txt", a) np.loadtxt("a.txt") array([[ 0. , 0.5, 1. , 1.5, 2. , 2.5], [ 3. , 3.5, 4. , 4.5, 5. , 5.5], [ 6. , 6.5, 7. , 7.5, 8. , 8.5], [ 9. , 9.5, 10. , 10.5, 11. , 11.5]]) np.savetxt("a.txt", a, fmt="%d", delimiter=",") #指定存储数据类型为整型,分隔符为, np.loadtxt("a.txt", delimiter=',') #以,分隔符读取 array([[ 0., 0., 1., 1., 2., 2.], [ 3., 3., 4., 4., 5., 5.], [ 6., 6., 7., 7., 8., 8.], [ 9., 9., 10., 10., 11., 11.]])