繁体   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