簡體   English   中英

Numpy 使用列表索引數組:arr[:][li] 和 arr[:,li] 之間的區別

[英]Numpy array indexing with a List: difference between arr[:][li] and arr[:,li]

以下行為的解釋是什么:

import numpy as np    
arr = np.zeros((3, 3))
li = [1,2]
print('output1:', arr[:, li].shape)
print('output2:', arr[:][li].shape)

>>output1: (3, 2)
>>output2: (2, 3)

我希望 output2 等於 output1。

您得到的是正確的 output。

在第一行

print('output1:', arr[:, li].shape)

您正在打印arr中每個子數組的2nd3rd元素,從而得到3元素,每個元素包含2值。

在第二行

print('output2:', arr[:][li].shape)

您首先選擇整個數組,然后從整個數組中選擇 select 2nd3rd元素(每個元素本身包含3元素),從而獲得2元素,每個元素包含3值。

如果您檢查此代碼,可以看到差異 -

import numpy as np    
arr = np.arange(9).reshape(3, 3)
li = [1,2]
print('output1:', arr[:, li])
print('output2:', arr[:][li])

這給出了 -

[[1 2]
 [4 5]
 [7 8]]

[[3 4 5]
 [6 7 8]]

當您執行arr[:, [1, 2]]時,您所說的是要獲取數組的所有行( :指定此),然后從中獲取列[1, 2]

另一方面,當您執行arr[:]時,您首先指的是整個數組。 您再次從中取出前兩行。

本質上,在第二種情況下, [1 2]指的是原始數組的行軸,而在第一種情況下,它指的是列。

讓我們使用一個不同的數組,這樣更容易看出區別:

>>> arr = np.arange(9).reshape(3, 3)
>>> arr
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

第一種情況arr[:, li]將 select 來自第一個維度的所有元素(在本例中為所有行),然后使用[1, 2]索引數組,這意味着只需省略第一列:

array([[1, 2],
       [4, 5],
       [7, 8]])

因此,它的形狀是 (3, 2)。

另一種情況arr[:]將復制原始數組,因此它不會改變形狀,因此它等同於arr[li] ,因此 output 形狀是(2, 3) 一般來說,您應該避免對數組進行雙重索引,因為這可能會創建兩次視圖,這是低效的。

暫無
暫無

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

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