【问题标题】:How to select values in a n-dimensional array如何在 n 维数组中选择值
【发布时间】:2015-11-16 20:04:37
【问题描述】:

我一直在尝试执行一个简单的操作,但我似乎无法找到一种简单的方法来使用 Numpy 函数来执行此操作而不创建不必要的数组副本。

假设我们有以下 3 维数组:

In [171]: x = np.arange(24).reshape((4, 3, 2))
In [172]: x
Out[172]: 
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]]])

还有以下数组:

In [173]: y = np.array([0, 1, 1, 0])

我想在x 中为每一行选择索引为y 中对应元素的最后一个维度的值。换句话说,我想要:

array([[ 0,  2, 4],
       [ 7,  9, 11],
       [13, 15, 17],
       [18, 20, 22]])

我目前唯一的解决方案是在xy 的第一个维度上使用for 循环,如下所示:

z = np.zeros((4, 3), dtype=int)
for i, row in enumerate(x):
    z[i, :] = row[:, y[i]]

有没有办法在这里避免 for 循环,使用 numpy 函数或花哨的索引?

谢谢!

【问题讨论】:

  • 您的y 数组是一维的,而不是二维的(也影响标题)。
  • 另见当前 SO 问题:stackoverflow.com/questions/33735987/…
  • 我会很乐意更新标题,我不知道如何解释它......你有什么建议吗? :)

标签: python arrays numpy indexing


【解决方案1】:

棘手的方面是您不希望每个切片的所有第 0 维,您希望切片与第 0 维中的每个元素对应。所以你可以这样做:

>>> x[np.arange(x.shape[0]), :, y]
array([[ 0,  2,  4],
       [ 7,  9, 11],
       [13, 15, 17],
       [18, 20, 22]])

【讨论】:

  • 感谢您的回答!我将不得不阅读更多关于它的信息......当第一次阅读你的答案时,我认为它会给出与使用 : 对于第 0 维相同的结果,我必须测试你的解决方案以说服自己!
【解决方案2】:

花式索引:

x[np.arange(y.size),:,y]

给予:

array([[ 0,  2,  4],
       [ 7,  9, 11],
       [13, 15, 17],
       [18, 20, 22]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多