簡體   English   中英

保持 Numpy Arrays 2D

[英]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的規則,領先的維度通常是“自動的”。

基本 v 高級索引

在底層 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*BA@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],:]

注意ij周圍的括號,否則 C 將不是二維矩陣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM