【问题标题】:Dynamic Python Array Slicing动态 Python 数组切片
【发布时间】:2016-08-03 06:11:56
【问题描述】:

我面临的情况是,我有一个非常大的 numpy.ndarray(实际上,它是一个 hdf5 数据集),我需要快速找到它的一个子集,因为它们的整个数组无法保存在内存中。但是,我也不想遍历这样的数组(即使声明内置的 numpy 迭代器也会抛出 MemoryError),因为我的脚本实际上需要几天才能运行。

因此,我面临着遍历数组的某些维度的情况,以便我可以对整个数组的缩减子集执行数组操作。为此,我需要能够动态地切出数组的一个子集。动态切片意味着构造一个元组并传递它。

例如,而不是

my_array[0,0,0]

我可能会使用

my_array[(0,0,0,)]

问题来了:如果我想手动切出数组特定维度/轴上的所有值,我可以这样做

my_array[0,:,0]
> array([1, 4, 7])

但是,如果我使用元组,这将不起作用:

my_array[(0,:,0,)]

我会在哪里获得SyntaxError

当我必须动态构造切片以将某些内容放入数组的括号中时,我该怎么做?

【问题讨论】:

    标签: python numpy multidimensional-array slice


    【解决方案1】:

    您可以使用 python 的 slice 自动切片

    >>> a = np.random.rand(3, 4, 5)
    >>> a[0, :, 0]
    array([ 0.48054702,  0.88728858,  0.83225113,  0.12491976])
    >>> a[(0, slice(None), 0)]
    array([ 0.48054702,  0.88728858,  0.83225113,  0.12491976])
    

    slice 方法读作slice(*start*, stop[, step])。如果仅传递一个参数,则将其解释为slice(0, stop)

    在上面的例子中,: 被翻译成slice(0, end),相当于slice(None)

    其他切片示例:

    :5 -> slice(5)
    1:5 -> slice(1, 5)
    1: -> slice(1, None)
    1::2 -> slice(1, None, 2)
    

    【讨论】:

    • 如果需要,您可以动态构建这样一个元组,如最近的stackoverflow.com/q/36561777/901925
    • 谢谢。正如您发布的那样,我发现slice(None) 使用。这正是我所需要的。
    • @hpaulj 非常有趣(和相关问题)idd。没看到那个。
    【解决方案2】:

    好的,我终于和其他人一样找到了答案。

    假设我有数组:

    my_array[...]
    >array(
      [[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],
    
       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]]])
    

    我可以使用slice 对象,这显然是一个东西:

    sl1 = slice( None )
    sl2 = slice( 1,2 )
    sl3 = slice( None )
    ad_array.matrix[(sl1, sl2, sl3)]
    >array(
      [[[ 4,  5,  6]],
    
       [[13, 14, 15]]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-14
      • 2014-03-18
      • 1970-01-01
      • 2012-11-10
      • 2020-12-11
      • 2011-08-30
      • 2014-08-15
      • 2018-01-23
      相关资源
      最近更新 更多