[英]Keep Numpy Arrays 2D
我正在做很多向量代數,並想使用 numpy arrays 來消除對循環的任何需求並運行得更快。
我發現如果我有一個大小為 [N,P] 的矩陣 A,我經常需要使用np.array([A[:,0]).T
來強制A[:,0]
成為大小為 (N,1) 的列向量
有沒有辦法將二維數組的單行或列保持為二維數組,因為它使以下算術變得更加容易。 例如,我經常需要將列向量(來自矩陣)與行向量(也從矩陣創建)相乘以創建一個新矩陣:例如
C = A[:,i] * B[j,:]
如果我不必繼續使用,那就太好了:
C = np.array([A[:,i]]).T * np.array([B[j,:]])
它確實混淆了代碼 - 在 MATLAB 中,它只是C = A[:,i] * B[j,:]
這更容易閱讀和與基礎數學進行比較,特別是如果在同一行,但不幸的是,我的大多數同事都沒有 MATLAB 許可證。
請注意,這不是唯一的用例,因此此列 x 行操作的特定 function 並沒有太大幫助
甚至 MATLAB/Octave 也會擠出多余的維度:
>> ones(2,3,4)(:,:,1)
ans =
1 1 1
1 1 1
>> size(ones(2,3,4)(1,:)) # some indexing "flattens" outer dims
ans =
1 12
當我開始 MATLAB v3.5 2d 矩陣時,它就只有它了; 單元格、結構和更高維度是后來添加的(如上述示例所示)。
您的:
In [760]: A=np.arange(6).reshape(2,3)
In [762]: np.array([A[:,0]]).T
Out[762]:
array([[0],
[3]])
比需要的更復雜。 它創建一個列表,然后是一個 (1,N) 數組,最后是一個 (N,1)
A[:,[0]]
, A[:,:,None]
, A[:,0:1]
更直接。 甚至A[:,0].reshape(-1,1)
我想不出將標量和列表索引視為相同的簡單方法。
像np.atleast_2d
這樣的函數可以有條件地添加一個新維度,但它將是一個前導(外部)維度。 但是根據broadcasting
的規則,領先的維度通常是“自動的”。
在底層 Python 中,標量不能被索引,列表只能用標量和切片來索引。 底層語法允許使用元組進行索引,但列表拒絕這些。 numpy
大大擴展了索引 - 不是語法而是它如何處理這些元組。
numpy
使用切片和標量進行索引是basic
索引。 這就是可能發生尺寸損失的地方。 這與列表索引一致
In [768]: [[1,2,3],[4,5,6]][1]
Out[768]: [4, 5, 6]
In [769]: np.array([[1,2,3],[4,5,6]])[1]
Out[769]: array([4, 5, 6])
使用列表和 arrays 進行索引是advanced
索引,沒有任何列表對應項。 這可能是 MATLAB 和numpy
之間的差異最丑的地方:)
>> A([1,2],[1,2])
產生一個 (2,2) 塊。 在 numpy 中產生“對角線”
In [781]: A[[0,1],[0,1]]
Out[781]: array([0, 4])
要獲得塊,我們必須使用相互“廣播”的列表(或數組):
In [782]: A[[[0],[1]],[0,1]]
Out[782]:
array([[0, 1],
[3, 4]])
要獲得 MATLAB 中的“對角線”,我們必須使用sub2ind([2,2],[1,2],[1,2])
來獲得 [1,4] 平坦指數。
在
np.array([A[:,i]]).T * np.array([B[j,:]])
這是按元素( .*
)還是矩陣?
對於 (N,1) 和 (1,M) 對, A*B
和A@B
產生相同的 (N,M) 結果,但一個使用broadcasting
來泛化outer
積,另一個是內/矩陣積(與產品總和)。
https://numpy.org/doc/stable/reference/generated/numpy.matrix.html
從類似數組的 object 或從數據字符串返回矩陣。 矩陣是一個專門的二維數組,它通過操作保留其二維性質。 它具有某些特殊的運算符,例如*(矩陣乘法)和**(矩陣冪)。
我不確定如何重新實現它,這是一個有趣的練習。
如前所述,矩陣將被棄用。 但是從 np.array 中,您可以使用參數 ndim=2 指定維度:
np.array([1, 2, 3], ndmin=2)
您可以通過以下方式保持維度(使用@進行矩陣乘法)
C = A[:,[i]] @ B[[j],:]
注意i
和j
周圍的括號,否則 C 將不是二維矩陣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.