动态Python数组切片

4
我面临的情况是需要处理一个非常大的 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 错误的位置。

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

2个回答

8
你可以使用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)

1
如果需要的话,您可以动态构建这样的元组,就像最近的http://stackoverflow.com/q/36561777/901925中所示。 - hpaulj
谢谢。当您发布时,我找到了slice(None)的用法。那正是我所需要的。 - roninveracity
@hpaulj 真的很有趣(而且相关的问题)确实。没看到那个。 - Imanol Luengo

0

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

假设我有一个数组:

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]]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接