標籤:
1. 線性代數
numpy對於多維陣列的運算在預設情況下並不使用矩陣運算,進行矩陣運算可以通過matrix對象或者矩陣函數來進行;
matrix對象由matrix類建立,其四則運算都預設採用矩陣運算,和matlab十>分相似:
a = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
a * a
matrix([[ 30, 36, 42],
[ 66, 81, 96],
[102, 126, 150]])
a + a
matrix([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
a ** -1
matrix([[ -4.50359963e+15, 9.00719925e+15, -4.50359963e+15],
[ 9.00719925e+15, -1.80143985e+16, 9.00719925e+15],
[ -4.50359963e+15, 9.00719925e+15, -4.50359963e+15]])
由於numpy中已經有ndarray,再用matrix比較容易弄混;
矩陣乘積運算:
對於ndarray對象,numpy提供多種矩陣乘積運算:dot()、inner()、outer()
dot():對於兩個一維數組,計算的是這兩個數組對應下標元素的乘積和,即:內積;對於二維數組,計算的是兩個數組的矩陣乘積;對於多維陣列,結>果數組中的每個元素都是:數組a最後一維上的所有元素與數組b倒數第二維>上的所有元素的乘積和:
dot(a,b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
結果數組c,可以看做是數組a和b的多個子矩陣的乘積;
inner():對於一維數組,計算的是這兩個數組的內積;對於多維陣列,計算的結果數組中的每個元素是:數組a和b最後一維的內積,因此a和b的最後一>維長度必須相同:
inner(a,b)[i,j,k,m] = sum(a[i,j,:]*b[k,m,:])
outer():如果傳入參數數組是多維陣列,則先將此數組展平為一位元組,然後再進行計算,得到兩個一維數組的外積:
?
outer([1,2,3],[4,5,6,7])
array([[ 4, 5, 6, 7],
[ 8, 10, 12, 14],
[12, 15, 18, 21]])
解線性方程組
對矩陣更加進階的運算在numpy的linalg模組中可以找到:
np.linalg.solve()傳入兩個參數數組,a為N*N的二維數組,b為長度為N的一維數組,滿足 : a * x = b,解得x矩陣即是N元一次方程的解;
np.linalg.lstsq()傳入的參數數組不要求a數組為正方形,方程的個數可以>少於未知數的個數,lstsq()計算得到的結果是使得| b - a * x |最小的一>組解,這組解稱為最小二乘解,使得所有等式的誤差的平方和最小。
2. 掩碼數組
numpy.ma模組中提供掩碼數組的處理,這個模組中幾乎完整複製了numpy中的所有函數,並提供掩碼數組的功能;
一個掩碼數組由一個正常數組和一個布爾數組組成,布爾數組中值為True的>元素表示正常數組中對應下標的值無效,False表示有效;
建立掩碼數組:
建立掩碼數組:
import numpy.ma as ma
x = np.array([1,2,3,5,7,4,3,2,8,0])
mask = x < 5
mx = ma.array(x,mask=mask)
mask
array([ True, True, True, False, False, True, True, True, False, True], dtype=bool)
mx
masked_array(data = [-- -- -- 5 7 -- -- -- 8 --],
mask = [ True True True False False True True True False True],
fill_value = 999999)
掩碼數組具有三個屬性:data、mask、fill_value;data表示原始數值數組>,mask表示獲得掩碼用的布爾數組,fill_value表示的填儲值替代無效值之>後的數組,該數組通過filled()方法查看;
掩碼數組可以使用各種下標對象對其進行存取,在被掩碼的部分值為masked>,可以設定某個位置值為ma.masked使其失效;
3. 檔案存取
numpy中提供多種存取數組內容的檔案操作函數,儲存的數組資料可以是二進位格式或者文字格式設定,二進位格式可以是無格式二進位和numpy專用的格式化二進位類型;
tofile()方法將數組資料寫到無格式二進位檔案中,tofile()輸出的資料不>儲存數組的形狀和元素類型等資訊;fromfile()函數可以讀取無格式二進位>檔案,此時,需要正確設定數組的元素類型dtype, 以及後續進行正確的形>狀轉換操作;如果指定了sep參數,則tofile()、fromfile()將以文字格式設定進行輸入輸出,sep指定文本的分隔字元;
load()、save()將數組資料儲存為numpy專用的二進位檔案中,會自動處理元素類型和形狀等資訊;如果一次性儲存多個數組,則可以使用savez(),savez()函數的第一個參數是檔案名稱,其後的參數都是需要儲存的數組,也可以使用關鍵字參數為數組起名字,非關鍵字參數數組則會自動命名為arr_0、arr_1、…等,savez()輸出的是一個副檔名為npz的壓縮檔,其中每個檔案都是>一個用save()儲存的npy檔案,檔案名稱和數組名相同。load()會自動識別npz>檔案,並且返回類似字典的對象,通過數組名為鍵,可以提取其中的數組;
savetxt()、loadtxt()函數可以讀寫儲存一維而二維數組的文字檔,輸出>為間隔符分開的文本,通過delimiter參數指定間隔符;預設輸出的格式為‘%.18e‘,預設以空格分隔。
4. 記憶體映射數組
通過memmap()建立記憶體映射數組,該數組從檔案中讀取指定位移量的資料,>而不會把整個檔案讀入到記憶體中;可傳入參數:
filename:數組檔案
dtype:[uint8],元素類型
mode:[r+],讀模數式
offset:[0],位移量
shape:讀取的形狀
order:[C],元素排列格式,預設為C語言格式,F為Fortran格式;
python科學計算_numpy_線性代數/掩碼數組/記憶體映射數組