今天介紹一下numpy在線性代數(shù)方面的計算,使用并不復雜都是調用方法金砍。用到的同學記一記局蚀,用不到跳過也無妨。
顯而易見筆者一般用不到恕稠,所以到網(wǎng)上找了資料匯總在下面琅绅。
線性代數(shù)運算
函數(shù) | 描述 |
---|---|
dot | 兩個數(shù)組的點積 |
vdot | 兩個向量的點積 |
inner | 兩個數(shù)組的內積 |
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的內積 inner:\n', np.inner(arr1, arr3))
# 運行結果:
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的內積 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)
# 運行結果:
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)生影響超陆。好比阿偉被胖揍一頓,鏡子里的他鼻青臉腫浦马,而克隆的阿偉未受影響一個道理时呀。
那么轉入numpy的正題。
使用numpy涉及龐大的數(shù)組操作谨娜、運算,如果沒弄清深淺拷貝的概念趴梢,很容易操作錯誤。
numpy中封裝了copy的思想币他,因此可以直接調用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)
# 運行結果:
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ù)拷貝的知識就總結到這里坞靶。
線代中涉及的數(shù)學概念如點積、向量蝴悉、矩陣等,這里并未過多介紹辫封,有興趣的同學可以再找資料翻看一下,未來使用numpy進行科學運算時會更加得心應手倦微。