【问题标题】:Select different slices from each numpy row从每个 numpy 行中选择不同的切片
【发布时间】:2019-09-11 05:00:42
【问题描述】:

我有一个 3d 张量,我想从 dim=2 中选择不同的切片。类似a[[0, 1], :, [slice(2, 4), slice(1, 3)]]

a=np.arange(2*3*5).reshape(2, 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]]])
# then I want something like a[[0, 1], :, [slice(2, 4), slice(1, 3)]]
# that gives me np.stack([a[0, :, 2:4], a[1, :, 1:3]]) without a for loop
array([[[ 2,  3],
        [ 7,  8],
        [12, 13]],

       [[16, 17],
        [21, 22],
        [26, 27]]])

我见过this,但这不是我想要的。

【问题讨论】:

  • 你为什么不想要链接的答案?你不同意我关于某种循环是必要的说法吗?为什么?

标签: python numpy multidimensional-array array-indexing


【解决方案1】:

您可以按照此处的说明使用advanced indexing。您将必须传递在您的情况下为 [0, 1] 的行 ID 和列 ID 2, 31, 2。这里2,3 表示[2:4]1, 2 表示[1:3]

import numpy as np
a=np.arange(2*3*5).reshape(2, 3, 5)

rows = np.array([[0], [1]], dtype=np.intp)
cols = np.array([[2, 3], [1, 2]], dtype=np.intp)

aa = np.stack(a[rows, :, cols]).swapaxes(1, 2)
# array([[[ 2,  3],
#         [ 7,  8],
#         [12, 13]],

#        [[16, 17],
#         [21, 22],
#         [26, 27]]])

避免swapaxes 并获得所需格式的结果的另一种等效方法是

aa = np.stack(a[rows, :, cols], axis=2).T

我想出的第三种方法是传递索引列表。这里[0, 0] 将对应[2,3][1, 1] 将对应[1, 2]swapaxes 只是为了获得您想要的输出格式

a[[[0,0], [1,1]], :, [[2,3], [1,2]]].swapaxes(1,2)

【讨论】:

  • 您已将切片转换为高级索引数组 - 在一般情况下,这需要在切片上循环并使用arange(或r_)扩展它们。还应该提到的是,swapaxes 是必需的,因为您的索引仍然在中间有一个切片 - 并且该维度被“附加”到最后(结合高级和基本索引的情况)。
【解决方案2】:

解决方案...

import numpy as np
a = np.arange(2*3*5).reshape(2, 3, 5)
np.array([a[0,:,2:4], a[1,:,1:3]])

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 2017-09-10
    • 2019-04-02
    • 2020-05-07
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多