123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
import numpy as np# 1、读取文件数据pk10 = np.genfromtxt("../pk10.txt",delimiter=" ",dtype="str") # 读取文件数据,并且指定“ ”为分隔符print(type(pk10))print(pk10)print(help(np.genfromtxt)) # 查看函数的帮助文档"""<class "numpy.ndarray">[["2017-12-15" "656198" "5,1,8,2,9,3,10,4,7,6"] ["2017-12-15" "656197" "5,9,10,4,2,7,3,6,8,1"] ["2017-12-15" "656196" "4,9,7,2,3,6,1,5,10,8"] ..., ["2012-01-01" "274575" "3,7,10,4,8,6,9,5,1,2"] ["2012-01-01" "274574" "2,5,4,7,6,10,8,1,9,3"] ["2012-01-01" "274573" "8,4,6,3,2,9,5,10,1,7"]]"""# 2、创建矩阵a1 = np.array([1,2,3]) # 创建一维矩阵a2 = np.array([[1,2,3],[1,2,3]]) # 创建一个二维矩阵print(a1.shape) # 查看矩阵的结构 (3,) 3行1列print(a2.shape) # 查看矩阵的结构 (2,3) 2行3列# 3、类型转换## numpy array传入的值必须同一类型,不然会自动转换成为较少数量的数值类型b1 = np.array([1,2,3,4])b2 = np.array([1,2,3,4.])b3 = np.array([1,2,3,"4"])print(b1.dtype) # int32print(b2.dtype) # float64print(b3.dtype) # <U11# 4、选取数据## 和python使用方法一样c1 = np.genfromtxt("../pk10.txt",delimiter=" ",dtype="str")print(c1[1,2]) # 5,9,10,4,2,7,3,6,8,1print(c1[2,1]) # 656196# 5、切片d1 = np.array([5,10,15,20])print(d1[0:3]) # [5,10,15] 切片切取0到3的数据 不包括3d2 = np.array([ [5,10,15], [20,25,30], [30,35,40]])print(d2[:,1]) # [10 25 35] 切片切取整个数据结构的下标为1的列# 6、对Numpy结构一次操作会同步给每一个e1 = np.array([5,10,15,20])## 如进行一个判断操作,就可以对每个对象进行相同操作,就不用for循环print(e1 == 10) # array([False, True, False, False], dtype=bool)e2 = np.array([ [5,10,15], [20,25,30], [30,35,40]])print(e2 == 10)"""array([[False, True, False], [False, False, False], [False, False, False]], dtype=bool)"""## 将判断的布尔值作为参数传入数据对象e3 = (e1 == 10)print(e1[e3]) # [10]e4 = (e2[:,1] == 25)print(e2[e4,:]) # [[20,25,30]]# 7、或 与 操作f1 = np.array([5,10,15,20])f2 = (f1 == 10) & (f1 == 5) # 与 操作 array([False, False, False, False], dtype=bool)f3 = (f1 == 10) | (f1 == 5) # 或 操作 array([ True, True, False, False], dtype=bool)# 8、改变numpy.array的数据类型g1 = np.array(["1","2","3"])g2 = g1.astype(float)print(g1.dtype) # <U1print(g2.dtype) # float64print(g2) # array([ 1., 2., 3.])# 9、最小值最大值h1 = np.array([5,10,15,20])print(h1.max()) # 5print(h1.min()) # 20## 了解更多属性 print(help(np.array))# 10、指定维度计算i1 = np.array([ [5,10,15], [20,25,30], [30,35,40]])i2 = i1.sum(axis = 1) # array([ 30, 75, 105]) 若axis=1 则按行计算每一行的和i3 = i1.sum(axis = 0) # array([55, 70, 85]) 若axis=0 则按列计算每一列的和# 11、数据结构变换j1 = np.arange(15) # np.aramge 创建出来的是向量格式j2 = j1.reshape(3,5) # reshape 是将向量转换成指定格式的矩阵"""array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])"""j2.shape # 矩阵结构 (3,5)j2.ndim # 矩阵维度 2j2.dtype.name # 矩阵数据类型 "int32"j2.size # 矩阵长度 15# 12、初始化一个矩阵,值都是0k1 = np.zeros((3,4)) # 初始化矩阵结构为 (3,4)"""array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]])"""# 13、初始化一个矩阵,值都是1k2 = np.ones((2,3,4),dtype=np.int32) # 初始化矩阵结构为 (2,3,4) 且数据是int32"""array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]])"""# 14、arange数据间隔k3 = np.arange( 10,30,5 ) # array([10, 15, 20, 25])# 介绍 np.arange(start,end,skip) 开始,结束,跳过 且不包含end值k4 = np.arange(12).reshape(4,3)"""array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]])"""# 15、随机数的使用l1 = np.random.random((2,3)) # 随机数返回的是矩阵,这里设置矩阵结构"""array([[ 0.25731809, 0.14592857, 0.1125052 ], [ 0.94415331, 0.46446762, 0.26658256]])"""from numpy import pil2 = np.linspace( 0, 2*pi, 100) # np.linspace(start,end,total)## linspace生成的是从start到end中平均取total个数据# 16、数学算术 对应位置进行操作m1 = np.array( [20,30,40,50] ) # array([20, 30, 40, 50])m2 = np.array( 4 ) # array(4)m3 = m1 - m2 # array([16, 26, 36, 46])m4 = m3 - 1 # array([15, 25, 35, 45])m5 = m2 ** 2 # 16m6 = m1 < 35 # array([ True, True, False, False], dtype=bool)# 17、矩阵乘法n1 = np.array([[1,1],[0,1]])n2 = np.array([[2,0],[3,4]])n3 = n1 * n2 # 直接相乘: 对应位置数值相乘"""array([[2, 0], [0, 4]])"""n4 = n1.dot(n2) # 矩阵乘法1"""array([[5, 4], [3, 4]])"""n5 = np.dot(n1,n2) # 矩阵乘法2"""array([[5, 4], [3, 4]])"""# 18、计算eo1 = np.arange(3) # array([0, 1, 2])print(np.exp(o1)) # 求幂,如求e的n次方是0 -> 1 e的n次方是1 -> 2.71828183 [ 1. 2.71828183 7.3890561 ]print(np.sqrt(o1)) # 求平方根,如求多少的根号为0->0 多少的根号为1->1 [ 0. 1. 1.41421356]# 19、矩阵的操作p1 = np.floor(10*np.random.random((3,4)))"""array([[ 2., 4., 0., 1.], [ 1., 2., 7., 1.], [ 0., 5., 5., 6.]])"""p2 = p1.ravel() # p1.ravel() 方法是将矩阵拉成一维数组"""array([ 2., 4., 0., 1., 1., 2., 7., 1., 0., 5., 5., 6.])"""p2.shape = (6,2)### 也可以使用 p2.reshaoe = (6,-1) -1: 代表让系统自动计算列数"""array([[ 2., 4.], [ 0., 1.], [ 1., 2.], [ 7., 1.], [ 0., 5.], [ 5., 6.]])"""p2.T"""array([[ 2., 0., 1., 7., 0., 5.], [ 4., 1., 2., 1., 5., 6.]])"""## 矩阵拼接p3 = np.floor(10*np.random.random((2,2)))"""array([[ 9., 7.], [ 9., 8.]])"""p4 = np.floor(10*np.random.random((2,2)))"""array([[ 1., 9.], [ 0., 6.]])"""p5 = np.hstack((p3,p4)) # hstack 横着拼接"""array([[ 9., 7., 1., 9.], [ 9., 8., 0., 6.]])"""p6 = np.vstack((p3,p4)) # vstack 纵着拼接"""array([[ 9., 7.], [ 9., 8.], [ 1., 9.], [ 0., 6.]]) """## 矩阵分割p7 = np.floor(10*np.random.random((2,12)))"""array([[ 1., 7., 2., 2., 6., 1., 8., 9., 4., 8., 3., 4.], [ 9., 0., 2., 3., 7., 2., 9., 4., 3., 6., 3., 4.]])"""p8 = np.hsplit(p7,3) # hsplit()横向切割 平均分成3份"""[array([[ 1., 7., 2., 2.], [ 9., 0., 2., 3.]]), array([[ 6., 1., 8., 9.], [ 7., 2., 9., 4.]]), array([[ 4., 8., 3., 4.], [ 3., 6., 3., 4.]])]"""p8 = np.hsplit(p7,(3,4)) # 指定切分的位置( 3,4 )p9 = np.floor(10*np.random.random((12,2)))p10 = np.vsplit(p9,3) # vsplit()纵向切割 平均分成3份# 20、 复制的三种方法## 第一种 深拷贝 只是名字不同 实质指向完全一样 id相同 一起变化q1 = np.arange(12)q2 = q1print(q2 is p1) # Falseq2.shape = 3,4print(q1.shape) # (3, 4)print(id(q1)) # id是机器分配的唯一值 1410862548912print(id(q2)) # 1410862548912## 第二种 浅拷贝 id不同 但同时改变(共用)q3 = q1.view()print(q3 is q1) # Falseq3.shape = 2,6print(q1.shape) # (3, 4)q3[0,4] = 1234print(q1)"""array([[ 0, 1, 2, 3, 1234, 5], [ 6, 7, 8, 9, 10, 11]])"""print(id(q1)) # 1410862548912print(id(q3)) # 1502044416## 第三种 深拷贝 即id不同 又不同时改变p4 = p1.copy()print(p4 is p1) # Falsep4[0,0] = 9999print(p4)"""[[ 9.99900000e+03 4.00000000e+00 0.00000000e+00 1.00000000e+00] [ 1.00000000e+00 2.00000000e+00 7.00000000e+00 1.00000000e+00] [ 0.00000000e+00 5.00000000e+00 5.00000000e+00 6.00000000e+00]]"""print(p1)"""[[ 2. 4. 0. 1.] [ 1. 2. 7. 1.] [ 0. 5. 5. 6.]]"""# 21、排序和索引## 索引q1 = np.sin(np.arange(20)).reshape(5,4)"""array([[ 0. , 0.84147098, 0.90929743, 0.14112001], [-0.7568025 , -0.95892427, -0.2794155 , 0.6569866 ], [ 0.98935825, 0.41211849, -0.54402111, -0.99999021], [-0.53657292, 0.42016704, 0.99060736, 0.65028784], [-0.28790332, -0.96139749, -0.75098725, 0.14987721]])"""in1 = q1.argmax(axis = 0) # 指定axis=0即第0列中,获取索引值最大的索引# array([2, 0, 3, 1], dtype=int64)q2 = q1[in1, range(q1.shape[1])] # 使用索引去获取值# array([ 0.98935825, 0.84147098, 0.99060736, 0.6569866 ])# 拓展 np.tile(data , (x倍数, y倍数))q3 = np.arange(0, 40, 10)"""array([ 0, 10, 20, 30])"""q4 = np.tile( q3, (2,2))"""array([[ 0, 10, 20, 30, 0, 10, 20, 30], [ 0, 10, 20, 30, 0, 10, 20, 30]])"""q5 = np.tile( q3, (3,2))"""array([[ 0, 10, 20, 30, 0, 10, 20, 30], [ 0, 10, 20, 30, 0, 10, 20, 30], [ 0, 10, 20, 30, 0, 10, 20, 30]])"""# 排序q6 = np.array([[4, 3, 5],[1, 2, 1]])"""array([[4, 3, 5], [1, 2, 1]])"""q7 = np.sort(q6, axis=1)"""array([[3, 4, 5], [1, 1, 2]])"""q8 = np.array([4, 3, 1, 2])q9 = np.argsort(q8) # 从小到大 返回排序后的索引值"""array([2, 3, 1, 0], dtype=int64)"""