【问题标题】:Slicing a 4-D array in numpy在 numpy 中切片一个 4-D 数组
【发布时间】:2021-11-03 21:29:38
【问题描述】:

我创建了一个名为 'd' 的 numpy 数组,然后将其重塑为 'd1',如下所示:-

d=np.arange(32)
d1=d.reshape(2,2,2,4)

numpy 数组 'd1' 看起来像:-

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

我想对这个数组进行切片提取,得到两个一维数组,如下:-

[[13 14]
 [17 18]]

我是 numpy 的新手,两天前才刚刚开始。我能够通过索引和切片做一些基本的事情。然而,这个让我难倒了好几个小时。任何帮助将非常感激。 谢谢和问候。

【问题讨论】:

  • 我们必须猜测规则吗?更严重的是,这种选择的特点是什么:[[13 14] [17 18]]?
  • 您显示的输出看起来像一个 2x2 数组(不是“两个一维数组”)。另外,选择的逻辑是什么? 2x2 在中心?还有什么?
  • 好吧,如果它是一个 2x2 数组,那么 d1 的维度应该是多少?是的,它是一个二维数组。
  • d1 是一个 4 维数组,给定您的 .reshape(2,2,2,4)(四个维度)。
  • 是的。我明白你的意思。 d1 是一个形状为 (2,2,2,4) 的 4 维数组。所以它是一个 4-D 阵列,它基本上有两个 3-D 阵列、四个 2-D 阵列、八个 1-D 阵列,它们都有 4 列。这是我的理解。

标签: python numpy slice


【解决方案1】:

如果您的选择是任意的,并且您只是想要一种获取[[13, 14], [17, 18]] 的方法。那么,这里有一个可能的解决方案:

  1. 首先将您的 nd 数组重塑为二维数组

    >>> d.reshape(8, 4)
    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]])
    
  2. 沿剩余的两个轴正确切片:

    >>> d.reshape(8, 4)[3:5, 1:3]
    array([[13, 14],
           [17, 18]])
    

或者,您始终可以将索引分解为 d 形状并使用这些索引数组:

>>> idx = np.unravel_index([13, 14, 17, 18], d.shape)
(array([0, 0, 1, 1]),
 array([1, 1, 0, 0]),
 array([1, 1, 0, 0]),
 array([1, 2, 1, 2]))

>>> d[idx]
array([13, 14, 17, 18])

【讨论】:

  • 好的。所以基本上你将'd'数组转换为8个一维数组,从而制作一个更容易切片的最终二维数组。这似乎是个好主意。但我只是好奇它是否可以以目前的形式完成。谢谢顺便说一句。
  • 重塑是一项基本操作,不需要数据复制。我怀疑你会在不创建原始数组视图的情况下找到另一种方法。
  • 重塑是一项基本操作,不需要数据复制。我怀疑您会在不创建原始数组视图的情况下找到另一种方法。无论如何,我使用np.unravel_index 添加了一个替代解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2015-01-29
  • 2018-04-22
  • 2018-10-09
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多