【numpy筆記_11】線性代數(shù)、深淺拷貝

今天介紹一下numpy在線性代數(shù)方面的計算,使用并不復雜都是調(diào)用方法。用到的同學記一記,用不到跳過也無妨。

顯而易見筆者一般用不到,所以到網(wǎng)上找了資料匯總在下面。


線性代數(shù)運算

函數(shù) 描述
dot 兩個數(shù)組的點積
vdot 兩個向量的點積
inner 兩個數(shù)組的內(nèi)積
matmul 兩個數(shù)組的矩陣積
linalg.det 計算輸入矩陣的行列式
linalg.solve 求解線性矩陣方程
linalg.inv 計算矩陣的逆矩陣

使用時直接向函數(shù)傳入數(shù)組對象,像這樣:

import numpy as np
arr1 = np.arange(1,12,2).reshape(2, 3)
arr2 = np.arange(2,13,2).reshape(3, 2)
arr3 = np.arange(13,24,2).reshape(2, 3)
print('arr1數(shù)組:\n', arr1)
print('arr2數(shù)組:\n', arr2)
print('arr3數(shù)組:\n', arr3)
print('arr1和arr2的點積 dot:\n', np.dot(arr1, arr2))
print('arr1和arr3的內(nèi)積 inner:\n', np.inner(arr1, arr3))
# 運行結(jié)果:
arr1數(shù)組:
 [[ 1  3  5]
 [ 7  9 11]]
arr2數(shù)組:
 [[ 2  4]
 [ 6  8]
 [10 12]]
arr3數(shù)組:
 [[13 15 17]
 [19 21 23]]
arr1和arr2的點積 dot:
 [[ 70  88]
 [178 232]]
arr1和arr3的內(nèi)積 inner:
 [[143 197]
 [413 575]]

深拷貝和淺拷貝

deepcopy,如果python基礎學的不錯應該知道怎么個事。
簡言之,拷貝就是復制一份數(shù)據(jù),包含深拷貝和淺拷貝。深拷貝是創(chuàng)建一份新的數(shù)據(jù),值相同但地址不同,兩組數(shù)據(jù)完全獨立;淺拷貝則是復制數(shù)據(jù)的地址,原數(shù)據(jù)變化時,副本數(shù)據(jù)跟著變化。
舉個例子,深拷貝好比克隆一個你;而淺拷貝則是鏡子中的你,是個地址映射關系。
python的copy模塊能夠操作數(shù)據(jù)的深拷貝??磦€例子:

import copy
res1 = [1,3,5,7]
res2 = res1   #直接賦值就是淺拷貝
res2_deep = copy.deepcopy(res1)    # deepcopy()方法,深拷貝
print('res1的值為:', res1, '地址為:', id(res1))
print('res2的值為:', res2, '地址為:', id(res2))
print('res2_deep的值為:', res2_deep, '地址為:', id(res2_deep))
print('- '*20)

res1[0] = 333
print('操作更改res1為:', res1, '此時res2為', res2, '此時res2_deep為', res2_deep)
# 運行結(jié)果:
res1的值為: [1, 3, 5, 7] 地址為: 104956480
res2的值為: [1, 3, 5, 7] 地址為: 104956480
res2_deep的值為: [1, 3, 5, 7] 地址為: 104956160
- - - - - - - - - - - - - - - - - - - - 
操作更改res1為: [333, 3, 5, 7] 此時res2為 [333, 3, 5, 7] 此時res2_deep為 [1, 3, 5, 7]

在實例中,深拷貝下更改原數(shù)據(jù)并未對新拷貝的數(shù)據(jù)產(chǎn)生影響。好比阿偉被胖揍一頓,鏡子里的他鼻青臉腫,而克隆的阿偉未受影響一個道理。

那么轉(zhuǎn)入numpy的正題。

使用numpy涉及龐大的數(shù)組操作、運算,如果沒弄清深淺拷貝的概念,很容易操作錯誤。
numpy中封裝了copy的思想,因此可以直接調(diào)用copy方法實現(xiàn)對數(shù)組的深拷貝:

import numpy as np
arr1 = np.array([1,3,5,7])
arr2 = arr1
arr2_deep = np.copy(arr1)
print('arr1的值為:', arr1, '地址為:', id(arr2))
print('arr2的值為:', arr2, '地址為:', id(arr2))
print('arr2_deep的值為:', arr2_deep, '地址為:', id(arr2_deep))
print('- '*20)

arr1[0] = 333
print('操作更改arr1:', arr1, '此時arr2為', arr2, '此時arr2_deep為', arr2_deep)
# 運行結(jié)果:
arr1的值為: [1 3 5 7] 地址為: 90937824
arr2的值為: [1 3 5 7] 地址為: 90937824
arr2_deep的值為: [1 3 5 7] 地址為: 91245024
- - - - - - - - - - - - - - - - - - - - 
操作更改arr1: [333   3   5   7] 此時arr2為 [333   3   5   7] 此時arr2_deep為 [1 3 5 7]

有關線代和數(shù)據(jù)拷貝的知識就總結(jié)到這里。

線代中涉及的數(shù)學概念如點積、向量、矩陣等,這里并未過多介紹,有興趣的同學可以再找資料翻看一下,未來使用numpy進行科學運算時會更加得心應手。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容