簡體   English   中英

numpy:為什么(2,1)數組和垂直矩陣切片的差不是(2,1)數組

[英]Numpy: Why is difference of a (2,1) array and a vertical matrix slice not a (2,1) array

考慮以下代碼:

>>x=np.array([1,3]).reshape(2,1)
array([[1],
   [3]])   
>>M=np.array([[1,2],[3,4]])
array([[1, 2],
   [3, 4]])
>>y=M[:,0]
>>x-y
array([[ 0,  2],
   [-2,  0]])

我會直觀地感覺到這應該給出零的(2,1)向量。

但是,我並不是說這是應該做的事情,其他所有事情都是愚蠢的。 如果有人可以提供一些我能記住的邏輯,那么這樣的事情就不會在我的代碼中不斷產生錯誤,我只是想知道。

請注意,我並不是在問我如何實現自己想要的(我可以重塑y),而是希望對Python / Numpy為何能如此工作有更深入的了解。 也許我在概念上做錯了嗎?

y的形狀。 它是(2,) ; 1D。 源數組為(2,2),但是您正在選擇一列。 M[:,0]不僅選擇列,而且刪除該單例尺寸。

因此,對於2個操作,我們需要進行形狀更改:

M[:,0]: (2,2) => (2,)
x - y: (2,1) (2,) => (2,1), (1,2) => (2,2)

有多種方法可以確保y的形狀為(2,1)。 帶有列表/向量的索引, M[:,[0]] ; 帶有切片的索引M[:,:1] 添加尺寸M[:,0,None]

還請考慮當M[0,:]M[0,0]時會發生什么。

numpy.array索引使得在任何位置的單個值都可以折疊該維度,而切片將保留該維度,即使切片只有一個元素寬。 對於任何數量的尺寸,這都是完全一致的:

>> A = numpy.arange(27).reshape(3, 3, 3)
>> A[0, 0, 0].shape
()

>> A[:, 0, 0].shape
(3,)

>> A[:, :, 0].shape
(3, 3)

>> A[:1, :1, :1].shape
(1, 1, 1)

請注意,每次使用單個數字時,該維將被刪除。

您可以使用numpy.matrix獲得所需的語義,其中兩個單個索引返回一個0數組,所有其他類型的索引返回矩陣

>> M = numpy.asmatrix(numpy.arange(9).reshape(3, 3))

>> M[0, 0].shape
()

>> M[:, 0].shape   # This is different from the array
(3, 1)

>> M[:1, :1].shape
(1, 1)

您的示例使用numpy.matrix時可以按預期numpy.matrix

>> x = numpy.matrix([[1],[3]])
>> M = numpy.matrix([[1,2],[3,4]])
>> y = M[:, 0]
>> x - y
matrix([[0],
        [0]])

暫無
暫無

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

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