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

Select some specific columns in a 4D Numpy array

提问人:Michael995 提问时间:5/12/2023 更新时间:5/12/2023 访问量:72

问:

我正在尝试在 4D 数组中选择特定数量的列,但显然与 3D 数组相比,执行此操作的方法不同,例如:

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

生成的张量如下:

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 数组已经有一段时间了,但这是我第一次遇到 4 维数组。在切片方面,我没有问题,但是当我想选择特定列时,我会感到困惑。

Python 数组 numpy tensorflow slice

评论

1赞 hpaulj 5/12/2023
TGE方式是正确的。重读 和 .是一个有用的实用程序。从概念上讲,4d 与 3d 甚至 2d 没有什么不同。cumbersomadvanced indexingbroadcastingnp.ix_

答:

0赞 jC61 5/12/2023 #1
numpy_tensor[(0,2), (2,3), (0,2), (1,3,4)]

这将返回与上一个方法相同的输出。第一个元组 (0,2) 指定第一个维度的索引,第二个元组 (2,3) 指定第二个维度的索引,依此类推。 使用元组索引可以更简洁、更易于阅读,尤其是在处理更多维度或更复杂的切片时。