1. np.hstack np.column_stack
>>> np.hstack([np.array([1, 2, 3]), np.array([4, 5, 6])])array([1, 2, 3, 4, 5, 6])>>> np.column_stack([np.array([1, 2, 3]), np.array([4, 5, 6])])array([[1, 4], [2, 5], [3, 6]])
當然對等地,也存在,np.vstack, np.row_stack
>>> np.vstack([np.array([1, 2, 3]), np.array([4, 5, 6])])array([[1, 2, 3], [4, 5, 6]])>>> np.row_stack([np.array([1, 2, 3]), np.array([4, 5, 6])])array([[1, 2, 3], [4, 5, 6]]) # 兩者近乎等效
2. np.linalg.eig() np.linalg.eigh()
首先一點,不管二者處理的是不是對稱陣,兩者處理的首先是方陣(square array)。
兩者均用於矩陣特徵分解,np.linalg.eigh()適用於對稱矩陣,可見矩陣分析中針對對稱矩陣的特徵值分解有一套特殊的不同於一般矩陣的理論。
def main(): X = np.random.randn(3, 3) X = X.triu() X += (X.T-np.diag(X.diagonal())) # 構造對稱矩陣 X Lambda1, Q1 = np.linalg.eig(X) Lambda2, Q2 = np.linalg.eigh(X) print(Lambda1) # [ 1.53176315 -0.35907022 -1.8924684 ] # 排序不太嚴格 print(Lambda2) # [-1.8924684 -0.35907022 1.53176315] # 嚴格的升序if __name__ == '__main__': main()
3. array.T vs array.transpose()
形式上array.T自然比array.transpose()這樣一個函數調用形式稍顯簡潔。
>>> x = np.ones((3, 4))>>> x.Tarray([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])>>> x.transpose()array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
事實上,x.T == x.transpose(range(x.ndim)[::-1])
>>> x.transpose(range(x.ndim)[::-1])array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]])
4. np.triu np.tril
np.triu:upper triangle of an array
np.tril:lower triangle of an array
>>> x = np.array([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]])>>> xarray([[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]])>>> np.triu(x)array([[1, 2, 3], [0, 4, 5], [0, 0, 7], [0, 0, 0]])>>> np.tril(x)array([[1, 0, 0], [3, 4, 0], [5, 6, 7], [7, 8, 9]])
5. concatenate與hstack/vstack
注意,要進行拼接的數組都是以tuple_like((a, b))的形式傳遞給這三個函數的,
np.concatenate((a, b), axis=0) == np.vstack((a, b)) # 也對應於預設的情況,np.concatenate((a, b)) np.concatenate((a, b), axis=1) == np.hstack((a, b))