簡體   English   中英

numpy:從4D陣列中切出3D陣列?

[英]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.

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