我正面临一个非常大的情况numpy.ndarray(实际上,这是一个hdf5数据集),我需要快速找到一个子集,因为它们的整个数组无法保存在内存中。但是,我也不想遍历这样的数组(甚至声明内置的numpy迭代器都抛出MemoryError),因为我的脚本实际上需要几天才能运行。
numpy.ndarray
MemoryError
因此,我面临着遍历数组某些维度的情况,以便可以对完整数组的精简子集执行数组操作。为此,我需要能够动态切出数组的一个子集。动态切片意味着构造一个元组并将其传递。
例如,代替
my_array[0,0,0]
我可能会用
my_array[(0,0,0,)]
问题出在这里:如果我想沿着数组的特定维度/轴手动切出所有值,我可以做类似的事情
my_array[0,:,0] > array([1, 4, 7])
但是,如果使用元组,这将不起作用:
my_array[(0,:,0,)]
在那儿我会得到一个SyntaxError。
SyntaxError
当我必须动态构造切片以将某些内容放在数组的括号中时,该怎么办?
您可以使用python’s 自动 切片slice:
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(*start*, stop[, step])
slice(0, stop)
在上面的例子中:被转换成slice(0, end)其等效于slice(None)。
:
slice(0, end)
slice(None)
其他切片示例:
:5 -> slice(5) 1:5 -> slice(1, 5) 1: -> slice(1, None) 1::2 -> slice(1, None, 2)