【问题标题】:Multi dimensional array slice in one object一个对象中的多维数组切片
【发布时间】:2017-12-20 20:00:19
【问题描述】:

我有一个 numpy 数组:

arr = numpy.arange(25 * 10 * 20)
arr.resize((25, 10, 20))

我想得到这样的切片:

arr[3:6, 2:8, 7:9]

这行得通:

index = [slice(3, 6), slice(2, 8), slice(7, 9)]
arr[index]

但这不是:

>>> index = slice([3, 2, 7], [6, 8, 9])
>>> arr[index]
TypeError: slice indices must be integers or None or have an __index__ method

可以由一个slice 对象完成吗?还是只有 3 个 slices 中的 list 有效?

【问题讨论】:

  • 不是开箱即用,也不是一片,但this class 让它几乎一样方便。
  • 鉴于slicenumpy 索引的当前定义,切片元组是基础对象。任何替代方案最终都会产生这种效果。
  • 顺便说一下,元组是一个对象。切片也是一个简单的类,具有三个属性和几个方法。是 .__getitem__ 做的。

标签: python numpy slice


【解决方案1】:
>>> help(slice)
class slice(object)
 |  slice(stop)
 |  slice(start, stop[, step])

所以我们使用 slice(start, stop, step)

>>> import numpy as np
>>> x = np.arange(10)

## ERROR

>>> i=slice([1,3])
>>> x[i]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: slice indices must be integers or None or have an __index__ method

## OK

>>> i = slice(3,7,2)
>>> print(x)
[0 1 2 3 4 5 6 7 8 9]
>>> print(i)
slice(3, 7, 2)
>>> print(x[i])
[3 5]

对于多维:

>>> x = np.arange(12).reshape(3,4)
>>> x
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> i = slice(0,3,1)
>>> i
slice(0, 2, 1)
>>> x[i,i]
array([[0, 1],
       [4, 5]])

【讨论】:

    【解决方案2】:

    您可以创建切片列表,压缩两个索引列表:

    >>> slices = [slice(*i) for i in zip([3,2,7], [6,8,9])]
    >>> arr[slices]
    array([[[ 647,  648],
        [ 667,  668],
        [ 687,  688],
        [ 707,  708],
        [ 727,  728],
        [ 747,  748]],
    
       [[ 847,  848],
        [ 867,  868],
        [ 887,  888],
        [ 907,  908],
        [ 927,  928],
        [ 947,  948]],
    
       [[1047, 1048],
        [1067, 1068],
        [1087, 1088],
        [1107, 1108],
        [1127, 1128],
        [1147, 1148]]])
    

    检查numpy.array_equal

    >>> numpy.array_equal(arr[slices], arr[3:6,2:8,7:9])
    True
    

    【讨论】:

      【解决方案3】:

      你可以使用numpy.ogrid:

        a[ogrid[3:6, 2:8, 7:9]]
      

      选择你阻止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 2020-02-04
        • 2014-02-04
        • 2013-06-21
        • 2010-09-14
        • 2020-05-03
        • 2021-11-23
        相关资源
        最近更新 更多