[英]Numpy: slicing a 3D array from a 4D array?
假設我有一個尺寸為10 x 10 x 10 x 10的4D numpy數組,並且我想基於我知道的一些索引(例如[[1,2],0,[5,6],[ [9,0])。我該如何去做?如果我的索引不是連續的,該怎么辦?
例如,如果我嘗試這樣做:
test[0:2, 0, 3:5, 0:2]
我得到了預期的2 x 2 x 2陣列。 但是,如果我嘗試像這樣明確定義每個維值:
test[[0,1], 0, [3,4], [0,1]]
我取而代之的是2 x 1數組。 我究竟做錯了什么?
基本索引編制和高級索引編制之間的區別。 使用切片和標量進行索引是“基本的”。 當一個或多個索引是列表或數組時,它使用“高級”。 有關v基本索引的文檔
有多種方法可以生成所需的索引。 np.ix_
旨在np.ix_
此操作:
In [80]: np.ix_([0,1], [0], [3,4], [0,1])
Out[80]:
(array([[[[0]]],
[[[1]]]]), array([[[[0]]]]), array([[[[3],
[4]]]]), array([[[[0, 1]]]]))
In [79]: arr[np.ix_([0,1], [0], [3,4], [0,1])].shape
Out[79]: (2, 1, 2, 2)
要通過ix_
傳遞所有索引,我必須將第二個作為列表。 一種解決方法是ix_
在3個列表上使用ix_
,然后再添加0
:
In [81]: I,J,K=np.ix_([0,1], [3,4], [0,1])
In [82]: arr[I,i,J,K].shape
Out[82]: (2, 2, 2)
In [83]: I,J,K
Out[83]:
(array([[[0]],
[[1]]]), array([[[3],
[4]]]), array([[[0, 1]]]))
注意索引數組的形狀:
In [84]: I.shape
Out[84]: (2, 1, 1)
In [85]: J.shape
Out[85]: (1, 2, 1)
In [86]: K.shape
Out[86]: (1, 1, 2)
它們一起廣播成(2,2,2)形狀。 因此,以這種方式廣播的所有索引數組都應該起作用。 你可以讓J
與
In [87]: J
Out[87]:
array([[[3],
[4]]])
In [88]: np.array([3,4])[None,:,None]
Out[88]:
array([[[3],
[4]]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.