【问题标题】:Numpy 3D array indexing using lists使用列表的 Numpy 3D 数组索引
【发布时间】:2017-10-20 19:40:29
【问题描述】:

假设我有一个形状为 (10, 1000, 1000) 的 numpy 数组,并且我有三个列表,它们应该代表每个轴的索引范围,如下所示:

z_range = [0, 5]
y_range = [200, 300]
x_range = [300, 500]

我知道我可以执行以下操作,但似乎相当冗长:

arr[z_range[0]:z_range[1], y_range[0]:y_range[1], x_range[0]:x_range[1]]

有没有更简单的方法使用这三个列表来分割这个特定的数组?

【问题讨论】:

    标签: python arrays numpy indexing


    【解决方案1】:

    索引需要一个元组,因此您可以使用生成器表达式动态构建您的元组:

    >>> z_range = [0, 3]
    >>> y_range = [2, 3]
    >>> x_range = [3, 5]
    >>> arr = numpy.arange(5*5*5).reshape(5,5,5)
    >>> arr[tuple(slice(a, b) for a,b in (x_range, y_range, z_range))]
    array([[[ 85,  86,  87]],
    
           [[110, 111, 112]]])
    

    【讨论】:

      【解决方案2】:

      我真的想不出一个好方法。使用 Numpy 的各种索引技巧之一可能会有更好的方法。我能想到的最简单的方法是手动制作slice() 对象。 start:end 语法实际上直接转换为 slice(start, end) 对象。所以你可以写:

      arr[slice(*z_range), slice(*y_range), slice(*x_range)]
      

      所以这至少更好一点,但我认为你在清晰度方面并没有真正获得太多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 2019-12-23
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        • 2023-03-30
        相关资源
        最近更新 更多