python+numpy實(shí)現(xiàn)的基本矩陣操作示例
本文實(shí)例講述了python+numpy實(shí)現(xiàn)的基本矩陣操作。分享給大家供大家參考,具體如下:
#! usr/bin/env python # coding: utf-8 # 學(xué)習(xí)numpy中矩陣的代碼筆記 # 2018年05月29日15:43:40 # 參考網(wǎng)站:http://cs231n.github.io/python-numpy-tutorial/ import numpy as np #==================矩陣的創(chuàng)建,增刪查改,索引,運(yùn)算=================================# #==================矩陣的創(chuàng)建,增刪查改=================================# # # 創(chuàng)建行向量 # x = np.array([1,2,3]) # # 修改某個(gè)值 # x[0] = 0 # 注意下標(biāo)索引從0開(kāi)始,與MATLAB不一樣 # print(x) # print(x.shape) # print(type(x)) # # # 創(chuàng)建二維與多維矩陣 # matrix = np.array([[1,2,3],[1,2,3],[2,3,4]]) # 注意這里有一個(gè)小括號(hào),小括號(hào)中還有一個(gè)中括號(hào) # # 取出某個(gè)元素 # a1 = matrix[0][0] # print(a1) # print(matrix.shape) # # # # 創(chuàng)建特殊矩陣 # # 0矩陣 # zeros = np.zeros((2,2))# 注意,這里有兩個(gè)小括號(hào),并且返回浮點(diǎn)型數(shù)據(jù),而不是整形 # print(zeros) # # # 創(chuàng)建1矩陣 # ones = np.ones([3,3])# 注意這里也是兩個(gè)括號(hào),其中里面的小括號(hào)也可是中括號(hào),但是不建議使用 # print(ones) # # # 創(chuàng)建元素相同()的矩陣 # full = np.full((2,3),2) #其中第一個(gè)括號(hào)表示矩陣大小,后面的數(shù)字表示填充的數(shù)字 # print(full) # # # 創(chuàng)建對(duì)角數(shù)為1的矩陣 # diag = np.eye(3,3)#注意這里如果行列數(shù)不同,只會(huì)讓行列下標(biāo)相等的元素為1 # print(diag) # # # 創(chuàng)建隨機(jī)矩陣(值在0到1之間),注意這個(gè)方式不可以重復(fù),也就是隨機(jī)不可以全部重現(xiàn),每次運(yùn)行都會(huì)不一樣 # random = np.random.random((2,3)) # 寫(xiě)到這里,我需要說(shuō)明一點(diǎn),就是如何確定括號(hào)的個(gè)數(shù) # numpy下的方法肯定是有一個(gè)小括號(hào)的,且不可以改變 # 想要表達(dá)多維陣列,則需要輸入一個(gè)元祖(小括號(hào))或者列表(中括號(hào))來(lái)創(chuàng)建,這時(shí)就需要小括號(hào)或者中括號(hào) # 如果是自己手敲出多維陣列,每一行需要中括號(hào)表示,用逗號(hào)分離每一行,然后外層再用一個(gè)中括號(hào)表示整個(gè)矩陣,然后再作為一個(gè)舉證輸入函數(shù)中 # print(random) #=======================矩陣的索引,切片=========================# metaMatrix = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])#用逗號(hào),而不能用空格 # # 單個(gè)元素的索引 # a = metaMatrix[0][0] # b = metaMatrix[0,0] # 這里不能使用小括號(hào) # print(a) # print(b) # # # 切片操作 # a_ = metaMatrix[0:2,1]# 注意這里冒號(hào)后面的數(shù)是不索引的,如果缺省就是到最后,冒號(hào)前是可以得到的 # # 冒號(hào)后的數(shù)不索引,這時(shí)python的特點(diǎn),與MATLAB不一樣 # print(a_) # # # 注意切片操作后矩陣維度的變化 # a1 = metaMatrix[0:1,:] # a2 = metaMatrix[0,:] # b = metaMatrix[0,1] # print(a1) # print(a2) # print(b) # # 注意到這兩行代碼得到的數(shù)據(jù)是一樣的,但是維度已經(jīng)發(fā)生了變化 # print(a1.shape) #a1仍然是矩陣 # print(a2.shape) #a2則是一個(gè)行向量,相比原矩陣,這里就少了一個(gè)維度,這與MATLAB有點(diǎn)不同 # print(b.shape) #b是沒(méi)有維度的,就是一個(gè)數(shù)而已 # # # 利用已有矩陣創(chuàng)建新矩陣,方法比較多樣化 # SrcMatrix = np.array([[1,2], [3, 4], [5, 6]]) # print(SrcMatrix) # # 利用矩陣的方式索引原有矩陣 # matrix1 = SrcMatrix[[0,1],[1,1]]# 這時(shí)將兩個(gè)中括號(hào)的對(duì)應(yīng)元素組合起來(lái)進(jìn)行索引,是單個(gè)元素索引的擴(kuò)展 # # 進(jìn)行單個(gè)元素索引,然后組合起來(lái),并用np.array創(chuàng)建成np的數(shù)組 # matrix2 = np.array([SrcMatrix[0][1],SrcMatrix[1][1]]) # # 如果不用np.array來(lái)創(chuàng)建成np的矩陣,就會(huì)導(dǎo)致數(shù)據(jù)格式的變化,對(duì)應(yīng)的操作就會(huì)發(fā)生變化 # matrix3 = [SrcMatrix[0][1],SrcMatrix[1][1]] # print(matrix1) # print(matrix2) # print(matrix3) # print(type(matrix1)) # print(type(matrix2)) # print(type(matrix3)) # # # numpy矩陣的元素索引方式可以用于改變或者選擇矩陣不同行的元素(不僅僅是同一列的數(shù)據(jù)) # a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) # b = np.array([0,2,0,1]) # # 先介紹一下np.arrange()函數(shù),表示創(chuàng)建一個(gè)從起始值到結(jié)束值少1(前面提到過(guò),python中經(jīng)常不到這個(gè)值)的行向量,也可以設(shè)定步長(zhǎng) # c = a[np.arange(4),b] #其實(shí)就是相當(dāng)于矩陣方式索引一個(gè)矩陣中的元素(這比MATLAB中更加自由一些) # print(c) # # 改變矩陣的指定元素 # a[np.arange(4),b] += 10 # print(a) # # # 布爾型陣列,可以用來(lái)索引一些滿足特定條件的元素 # matrix = np.array([[1,2],[3,4],[5,6]]) # bool_id = matrix>2 # 也可以寫(xiě)成bool_id =(matrix>2),注意,寫(xiě)成中括號(hào)就是不同含義了 # print(bool_id) # print(matrix[bool_id]) # # 可以將上面兩行代碼合成一行 # matrix_ = matrix[matrix>2]# 注意,這里得到的是一維向量 # print(matrix_) # #=========================numpy array的數(shù)據(jù)類(lèi)型=======================================# # # numpy的array的數(shù)據(jù)類(lèi)型是自動(dòng)識(shí)別的,但也可以指定 # # 如果輸入為整形,則會(huì)給數(shù)據(jù)的類(lèi)型定義為int64 # matrix1 = np.array([1,2,3]) # print(matrix1.dtype) # # 如果輸入的數(shù)據(jù)為小數(shù)點(diǎn),則會(huì)給數(shù)據(jù)類(lèi)型定義為float64 # matrix2 = np.array([1.0,2.0,3.0]) # print(matrix2.dtype) # # 如果有浮點(diǎn)型也有整形數(shù)據(jù),會(huì)賦值給占字節(jié)數(shù)多的數(shù)據(jù)類(lèi)型,且對(duì)應(yīng)為64的 # matrix3 = np.array([1,2.0]) # print(matrix3.dtype) # # 也可以指定數(shù)據(jù)類(lèi)型 # matrix4 = np.array([1,2],dtype=np.int8) # print(matrix4.dtype) # # 當(dāng)數(shù)據(jù)本身和指定的數(shù)據(jù)類(lèi)型不符合時(shí),會(huì)將數(shù)據(jù)轉(zhuǎn)化成指定的數(shù)據(jù)類(lèi)型,有可能會(huì)發(fā)生溢出 # matrix5 = np.array([1,2000000,3.1],dtype=np.int8) # print(matrix5) # print(matrix5.dtype) #=========================矩陣的運(yùn)算===================================# # # # 兩種加法和減法,乘除 # x = np.array([[1,2],[3,4]]) # y = np.array([[5,6],[7,8]]) # sum1 = x + y# 直接使用加法 # sum2 = np.add(x,y)# 運(yùn)用numpy的函數(shù) # print(sum1) # print(sum2) # # substract1 = x - y # substract2 = np.subtract(x,y) # print(substract1) # print(substract2) # # prodution1 = x * y# 這是對(duì)應(yīng)元素的乘法 # prodution2 = np.multiply(x,y) # print(prodution1) # print(prodution2) # # devide1 = x/y # devide2 = np.divide(x,y) # # 注意矩陣進(jìn)行運(yùn)算時(shí),數(shù)據(jù)類(lèi)型不改變,因此,需要注意溢出現(xiàn)象等 # print(devide1) # print(devide2) # # # 矩陣的兩種向量乘法(使用dot) # x = np.array([[1,2],[3,4]]) # y = np.array([[5,6],[7,8]]) # multiDot1 = x.dot(y) # multiDot2 = np.dot(x,y) # print(multiDot1) # print(multiDot2) # # # 矩陣運(yùn)算基本函數(shù) # x = np.array([[1,2],[3,4]]) # # 求和函數(shù) # # 對(duì)所有元素求和 # sum_all = np.sum(x) # # 對(duì)列求和 # sum_column = np.sum(x, 0)# 注意和MATLAB中的區(qū)分一下。 # # 對(duì)行求和 # sum_row = np.sum(x, 1) # print(sum_all) # print(sum_column) # print(sum_row) # # # 矩陣的轉(zhuǎn)置 # x = np.array([[1,2],[3,4]]) # transform = x.T # print(transform) # # # broadcasting的應(yīng)用,可以進(jìn)行不同維度的矩陣算數(shù)運(yùn)算 # # 考慮將一個(gè)常量行向量加到一個(gè)矩陣的每一行上 # # 下面會(huì)將x行向量加到y(tǒng)矩陣的每一行上(但是這個(gè)方法由于有顯示循環(huán),而顯示循環(huán)比較慢一些,我們經(jīng)常會(huì)采用其他方法) # y = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) # x = np.array([1, 0, 1]) # y_ = np.empty_like(y) # 創(chuàng)建一個(gè)和y相同維度的矩陣,但沒(méi)有放內(nèi)容,但是已經(jīng)開(kāi)辟了一塊內(nèi)存,其中的數(shù)據(jù)可能隨機(jī) # print(y_) # for i in range(4): # y_[i,:] = y[i,:] + x # print(y_) # # 另一種方法是我們先將x復(fù)制3份,垂直放置,組成一個(gè)矩陣,再進(jìn)行矩陣加法 # x_ = np.tile(x,(4,1))# np.tile表示復(fù)制,(4,1)表示將x作為元素,組成4*1的矩陣形式 # y__ = np.add(y,x_) # print(y__) # # 實(shí)際上,如果不對(duì)x進(jìn)行處理,而直接將兩者相加,如果x和y滿足一些條件,x會(huì)自動(dòng)復(fù)制 # # 條件是x和y在一個(gè)維度上相等,另一個(gè)維度上不一樣并且可以通過(guò)復(fù)制可以實(shí)現(xiàn)維度相等,則會(huì)自動(dòng)復(fù)制 # print(y+x) # # 這里進(jìn)行一個(gè)其他的測(cè)試 # print(x.T+y.T)# 可以看出可以實(shí)現(xiàn)列的復(fù)制 # 這里進(jìn)行都不為向量的相加 # a1 = np.array([[1,2],[3,4],[5,6],[7,8]]) # a2 = np.array([[1,0],[0,1]]) # print(a1+a2)# 這里會(huì)出錯(cuò),說(shuō)明只能自動(dòng)進(jìn)行一維數(shù)據(jù)的復(fù)制,多維數(shù)據(jù)不支持自動(dòng)復(fù)制,而需要顯式復(fù)制 # # 同樣的,加法,減法和除法也都適合上面的自動(dòng)復(fù)制原理 # 將一個(gè)矩陣或者向量進(jìn)行維度的調(diào)整 x1 = np.array([1,2,3]) y1 = np.array([1,2]) # 實(shí)現(xiàn)x1和y1轉(zhuǎn)置的矩陣乘法,可以先將y1變成列向量 print(np.multiply(x1, np.reshape(y1,(2,1)))) # 試一下其他的維度變化 x2 = np.array([[1,2],[3,4],[5,6],[7,8]]) print(np.reshape(x2, (2,4))) print(np.reshape(x2, (4,2)))# 基本上按照西安航后列的順序進(jìn)行
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門(mén)與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python常用庫(kù)Numpy進(jìn)行矩陣運(yùn)算詳解
- Python numpy矩陣處理運(yùn)算工具用法匯總
- python numpy矩陣信息說(shuō)明,shape,size,dtype
- Python numpy.zero() 初始化矩陣實(shí)例
- Python numpy中矩陣的基本用法匯總
- Python 使用Numpy對(duì)矩陣進(jìn)行轉(zhuǎn)置的方法
- Python使用numpy產(chǎn)生正態(tài)分布隨機(jī)數(shù)的向量或矩陣操作示例
- Python的numpy庫(kù)中將矩陣轉(zhuǎn)換為列表等函數(shù)的方法
- Python numpy大矩陣運(yùn)算內(nèi)存不足如何解決
相關(guān)文章
python調(diào)用win32接口進(jìn)行截圖的示例
這篇文章主要介紹了python調(diào)用win32接口進(jìn)行截圖的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11python MultipartEncoder傳輸zip文件實(shí)例
這篇文章主要介紹了python MultipartEncoder傳輸zip文件實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Flask學(xué)習(xí)筆記之日志操作配置實(shí)例講解
這篇文章主要為大家介紹了Flask學(xué)習(xí)筆記之日志操作配置實(shí)例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11python 基礎(chǔ)學(xué)習(xí)第二彈 類(lèi)屬性和實(shí)例屬性
本人c程序員,最近開(kāi)始學(xué)python,深深的被python的強(qiáng)大所吸引,今后也會(huì)把學(xué)到的點(diǎn)點(diǎn)滴滴記錄下來(lái),現(xiàn)在分享一下關(guān)于類(lèi)屬性和實(shí)例屬性的一些問(wèn)題,很基礎(chǔ)的東西2012-08-08Python 字符串類(lèi)型列表轉(zhuǎn)換成真正列表類(lèi)型過(guò)程解析
這篇文章主要介紹了Python 字符串類(lèi)型列表轉(zhuǎn)換成真正列表類(lèi)型過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-083種Python 實(shí)現(xiàn)酷炫進(jìn)度條的實(shí)用方法
這篇文章主要介紹了3種Python 實(shí)現(xiàn)酷炫進(jìn)度條的實(shí)用方法,文章圍繞Python的相關(guān)資料展開(kāi)對(duì)實(shí)現(xiàn)進(jìn)度條的介紹,需要的小伙伴可以參考一下2022-04-04