在4D Numpy数组中选择一些特定列

vyu0f0g1  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(158)

我试图在4D数组中选择特定数量的列,但显然与3D数组相比,这样做的方式是不同的,例如:

numpy_vector = np.arange(0,120,dtype=np.int8)
numpy_tensor = numpy_vector.reshape(3,4,3,5)

结果Tensor是这样的:

array([[[[   0,    1,    2,    3,    4],
         [   5,    6,    7,    8,    9],
         [  10,   11,   12,   13,   14]],

        [[  15,   16,   17,   18,   19],
         [  20,   21,   22,   23,   24],
         [  25,   26,   27,   28,   29]],

        [[  30,   31,   32,   33,   34],
         [  35,   36,   37,   38,   39],
         [  40,   41,   42,   43,   44]],

        [[  45,   46,   47,   48,   49],
         [  50,   51,   52,   53,   54],
         [  55,   56,   57,   58,   59]]],

       [[[  60,   61,   62,   63,   64],
         [  65,   66,   67,   68,   69],
         [  70,   71,   72,   73,   74]],

        [[  75,   76,   77,   78,   79],
         [  80,   81,   82,   83,   84],
         [  85,   86,   87,   88,   89]],

        [[  90,   91,   92,   93,   94],
         [  95,   96,   97,   98,   99],
         [ 100,  101,  102,  103,  104]],

        [[ 105,  106,  107,  108,  109],
         [ 110,  111,  112,  113,  114],
         [ 115,  116,  117,  118,  119]]],

       [[[ 120,  121,  122,  123,  124],
         [ 125,  126,  127, -128, -127],
         [-126, -125, -124, -123, -122]],

        [[-121, -120, -119, -118, -117],
         [-116, -115, -114, -113, -112],
         [-111, -110, -109, -108, -107]],

        [[-106, -105, -104, -103, -102],
         [-101, -100,  -99,  -98,  -97],
         [ -96,  -95,  -94,  -93,  -92]],

        [[ -91,  -90,  -89,  -88,  -87],
         [ -86,  -85,  -84,  -83,  -82],
         [ -81,  -80,  -79,  -78,  -77]]]], dtype=int8)

它的形状是(3,4,3,5)
现在让我们假设:

  • 我想要第一维的第一个和第三个数组
  • 然后我想要第二维度的第三和第四个数组
  • 然后我想要第一行和第三行的第三维
  • 最后,我想要第二,第四和第五列的第四维(最后一个)。

我尝试用与3d数组相同的方式来执行它,但要么它给了我一个错误,要么输出错误,例如:

- numpy_tensor[[0,2], [2,3], [0,2], [1,3,4]]
- output:
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (2,) (2,) (3,) 

- numpy_tensor[[0,2],[[2,3]]]
- output:
array([[[[ 30,  31,  32,  33,  34],
         [ 35,  36,  37,  38,  39],
         [ 40,  41,  42,  43,  44]],

        [[-91, -90, -89, -88, -87],
         [-86, -85, -84, -83, -82],
         [-81, -80, -79, -78, -77]]]], dtype=int8)

我通过以下方式得到了我想要的结果:

numpy_tensor[[0,2]][:, [2,3]][:,:,[0,2]][:,:,:,[1,3,4]]

输出:

array([[[[  31,   33,   34],
         [  41,   43,   44]],

        [[  46,   48,   49],
         [  56,   58,   59]]],

       [[[-105, -103, -102],
         [ -95,  -93,  -92]],

        [[ -90,  -88,  -87],
         [ -80,  -78,  -77]]]], dtype=int8)

但这似乎很麻烦,我不知道是否有一个更干净的方法来做。
我已经使用numpy数组有一段时间了,但这是我第一次遇到四维数组。当涉及到切片时,我没有问题,但当我想选择一个特定的列时,我会感到困惑。

brvekthn

brvekthn1#

numpy_tensor[(0,2), (2,3), (0,2), (1,3,4)]

这将返回与前一个方法相同的输出。第一元组(0,2)指定第一维度的索引,第二元组(2,3)指定第二维度的索引,等等。使用元组索引可以更简洁,更容易阅读,特别是当您处理更多维度或更复杂的切片时。

相关问题