动态 Python 数组切片
Dynamic Python Array Slicing
我面临这样一种情况,我有一个非常大的 numpy.ndarray
(实际上,它是一个 hdf5 数据集),我需要快速找到它的一个子集,因为它们的整个数组无法保存在内存中。但是,我也不想遍历这样的数组(甚至声明内置的 numpy 迭代器抛出一个 MemoryError
),因为我的脚本实际上需要几天才能达到 运行.
因此,我面临着遍历数组的某些维度的情况,以便我可以对整个数组的精简子集执行数组操作。为此,我需要能够动态切出数组的一个子集。动态切片就是构造一个元组并传递它。
例如,而不是
my_array[0,0,0]
我可能会用
my_array[(0,0,0,)]
问题是:如果我想手动切出数组中特定 dimension/axis 的所有值,我可以做类似
的事情
my_array[0,:,0]
> array([1, 4, 7])
但是,如果我使用元组,这将不起作用:
my_array[(0,:,0,)]
我会在哪里得到 SyntaxError
。
当我必须动态构造切片以将某些内容放入数组的括号中时,我该如何执行此操作?
您可以使用 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)
好吧,我终于和别人一样找到了答案
假设我有数组:
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]]])
我面临这样一种情况,我有一个非常大的 numpy.ndarray
(实际上,它是一个 hdf5 数据集),我需要快速找到它的一个子集,因为它们的整个数组无法保存在内存中。但是,我也不想遍历这样的数组(甚至声明内置的 numpy 迭代器抛出一个 MemoryError
),因为我的脚本实际上需要几天才能达到 运行.
因此,我面临着遍历数组的某些维度的情况,以便我可以对整个数组的精简子集执行数组操作。为此,我需要能够动态切出数组的一个子集。动态切片就是构造一个元组并传递它。
例如,而不是
my_array[0,0,0]
我可能会用
my_array[(0,0,0,)]
问题是:如果我想手动切出数组中特定 dimension/axis 的所有值,我可以做类似
的事情my_array[0,:,0]
> array([1, 4, 7])
但是,如果我使用元组,这将不起作用:
my_array[(0,:,0,)]
我会在哪里得到 SyntaxError
。
当我必须动态构造切片以将某些内容放入数组的括号中时,我该如何执行此操作?
您可以使用 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)
好吧,我终于和别人一样找到了答案
假设我有数组:
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]]])