關於numpy矩陣運算的小記

關於numpy矩陣運算的小記


發現做矩陣處理是numpy忘了好多,所以記錄下來.

array與matrix

matrix是array的分支,matrix和array在很多時候都是通用的,你用哪一個都一樣。但這時候,官方建議大家如果兩個可以通用,那就選擇array,因爲array更靈活,速度更快,很多人把二維的array也翻譯成矩陣。
但是matrix的優勢就是相對簡單的運算符號,比如兩個矩陣相乘,就是用符號*,但是array相乘不能這麼用,得用方法.dot()
array的優勢就是不僅僅表示二維,還能表示3、4、5…維,而且在大部分Python程序裏,array也是更常用的。

import numpy as np

a1 = np.array([[1, 2],
               [3, 4]])
a2 = np.array([[5, 6],
               [7, 8]])
b1 = np.mat([[1, 2],
             [3, 4]])
b2 = np.mat([[5, 6],
             [7, 8]])

print((np.dot(a1, a2)).all() == (b1 * b2).all())

輸出

True

矩陣判等

在矩陣判等中存在各個元素相等和整個矩陣相等兩種情況

import numpy as np

a1 = np.array([[1, 2],
               [3, 4]])
a2 = np.array([[5, 6],
               [7, 8]])
b1 = np.mat([[1, 2],
             [3, 4]])
b2 = np.mat([[5, 6],
             [7, 8]])
print('np.dot(a1, a2):\n', np.dot(a1, a2))
print('b1 * b2:\n', b1 * b2)
print((np.dot(a1, a2)) == (b1 * b2))
print((np.dot(a1, a2)).all() == (b1 * b2).all())

輸出:

其中==用於判等各個元素相等,用all()方法可以判斷整個矩陣相等

矩陣的連接

在numpy中存在按行連接與按列連接兩種形式

import numpy as np

x = np.array([[1, 2, 3],
              [4, 5, 6]])
print("x:\n", x)

y = np.array([[7, 8, 9],
              [10, 11, 12]])
print("y:\n", y)

z = np.array([[13, 14, 15]])
print("z:\n", z)

a = np.vstack((x, y, z))
print('np.vstack((x,y,z)):\n', a)
b = np.hstack((x, y))
print('np.hstack((x,y)):\n', b)

輸出:

其中np.hstack()是按行連接:行數相同的的連接在一起;np.vstack()按列連接:列書相同的連接在一起。

矩陣的向量化

在矩陣中我們可以使用reshape方法來實現矩陣的向量化,如果在整形操作中將尺寸標註爲-1,則會自動計算其他尺寸

import numpy as np

x = np.array([[1, 2, 3],
              [4, 5, 6]])
print("x:\n", x)

y = np.array([[7, 8, 9],
              [10, 11, 12]])
print("y:\n", y)

z = np.array([[13, 14, 15]])
print("z:\n", z)

a = np.vstack((x, y, z))
print('np.vstack((x,y,z)):\n', a)
b = np.hstack((x, y))
print('np.hstack((x,y)):\n', b)

print(a.shape)
print(a.reshape(-1,1))

輸出:

矩陣的拆分

使用hsplit,您可以沿數組的水平軸拆分數組,方法是指定要返回的形狀相同的數組的數量,或者指定要在其後進行劃分的列,使用vsplit,您可以沿數組的豎直軸拆分數組,方法是指定要返回的形狀相同的數組的數量,或者指定要在其後進行劃分的列。

import numpy as np

a = np.array([[1, 1, 2, 3],
              [1, 5, 7, 3],
              [7, 3, 9, 3],
              [1, 7, 3, 0]])
print(np.hsplit(a, 2))
print(np.vsplit(a, 2))

矩陣的複製

=的簡單分配不會複製數組對象或其數據,該copy方法對數組及其數據進行完整複製。

import numpy as np

a = np.array([[1, 1, 2, 3],
              [1, 5, 7, 3],
              [7, 3, 9, 3],
              [1, 7, 3, 0]])
# print(np.hsplit(a, 2))
# print(np.vsplit(a, 2))
b = a
print(id(a))
print(id(b))
c = a.copy()
print(id(c))

矩陣的逆

利用numpy.linalg.inv()可以求得矩陣的逆矩陣

import numpy as np

a = np.array([[1, 1, 2, 3],
              [1, 5, 7, 3],
              [7, 3, 9, 3],
              [1, 7, 3, 0]])

b = np.linalg.inv(a)
print(np.dot(a, b))

矩陣的索引

import numpy as np

a = np.array([[1, 1, 2, 3],
              [1, 5, 7, 3],
              [7, 3, 9, 3],
              [1, 7, 3, 0]])

print(a[2, 3])  # 輸出第2+1行第3+1列的數字
print(a[1:])  # 以矩陣形式輸出從第1+1行開始的所有數
print(a[1:3])  # 以矩陣形式輸出第1+1到第3+1-1行的數
print(a[:, 1])  # 輸出矩陣的第1+1列的所有數
print(a[0:3, 1])  # 輸出矩陣從0+1行到第3+1-1行的第1+1列的所有數
print(type(a[:3]))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章