今天介紹一下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進行科學運算時會更加得心應手。