python科學計算_numpy_線性代數/掩碼數組/記憶體映射數組

來源:互聯網
上載者:User

標籤:

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_線性代數/掩碼數組/記憶體映射數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.