簡體   English   中英

在Numpy陣列切片期間,行與列向量返回

[英]Row vs. Column Vector Return during Numpy Array Slicing

我目前正在學習Python,偶然發現了一個在執行基本數組切片命令時讓我感到困惑的結果。

我使用這個命令創建了一個4x5矩陣:

>>> a = numpy.arange(20).reshape(4,5)

這使:

[[ 0, 1, 2, 3, 4],
 [ 5, 6, 7, 8, 9],
 [10,11,12,13,14],
 [15,16,17,18,19]]

如果我像這樣索引數組:

>>> a[0:3, 2]

我得到一個行向量:

[2, 7, 12]

但是,如果我像這樣索引數組:

>>> a[0:3, 2:3]

我得到一個列向量:

[[ 2],
 [ 7],
 [12]]

當插入兩個命令時我期望結果是相同的,那么為什么我會得到不同類型的向量?

謝謝!

tl;博士版

在numpy中,從數組中沿着維度獲取單個索引會將維度減少1,因此從2D數組中獲取索引會生成1D數組(第一種情況)。 沿着維度采取切片保持相同的維度,即使切片的長度為1,因此采用2D數組的長度為1的切片仍然是2D數組(第二種情況)

詳細版本

問題是第一個結果不是行向量,而是一維數組。 當您從維度中獲取單個標量索引時,它會將維數減少1.因此,從4D陣列獲取標量索引會使其成為3D陣列,從3D陣列中取一個使其成為2D陣列,將2D陣列轉換為1D數組,1D數組到標量。

這是為了一致。 如果從1D數組中獲取項目會產生標量(將維度降低1),那么通過擴展,更高維度的等效操作應該以相同的方式運行。

在第二種情況下,你需要切片,而不是標量。 當您這樣做時,它會保留維度數。 因此,即使切片為空(或者在您的情況下為長度1),切片2D數組也始終是2D數組。 這也是為了保持一致性。 如果2D陣列的長度為3的切片是2D陣列,並且2D陣列的長度為2的切片是2D陣列,則2D陣列的長度為1的切片也應該是2D陣列。

這也是一種方便的約定,因為它允許您僅使用幾個字符明確定義是否要降低維度。

有些語言,如MATLAB,沒有一維數組(或技術上,矩陣)的概念,數組可以是0D(標量),2D,3D等,但不是1D。 另一方面,Python允許使用真正的一維數組,這可能使那些不習慣它的人絆倒。

如果使用兩個切片,則會得到兩個維度。 雖然你在第二個例子中得到的有時被稱為“列向量”,但它實際上是一個二維的Nx1數組。 這與您在第一個示例中得到的不同,后者根本不是二維的,而是一維數組。

您使用切片而不是單個值的事實是導致額外維度的原因。 Numpy不會查看切片實際抓取的元素數量; 它只是看你是否使用了切片。 如果a[0:3, 2:3]返回1D向量,但是a[0:3, 1:3]返回2D數組a[0:3, 1:3]那將更加令人困惑。

為什么是不同的命令。

在第一種情況下,您獲得前三行,其中包含第三行元素。 這將只返回元素。

在第二種情況下,您獲得前三行並指定第三列的兩個元素。 此列將返回它,或帶有一個元素的向量

暫無
暫無

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

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