[英]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
中每個子數組的2nd
和3rd
元素,從而得到3
元素,每個元素包含2
值。
在第二行
print('output2:', arr[:][li].shape)
您首先選擇整個數組,然后從整個數組中選擇 select 2nd
和3rd
元素(每個元素本身包含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.