【发布时间】:2013-06-25 14:54:07
【问题描述】:
假设我有一个 3D numpy.array,例如尺寸为 x y z,有没有办法沿特定轴迭代切片?比如:
for layer in data.slices(dim=2):
# do something with layer
编辑:
澄清一下,这个例子是一个 dim=3 数组,即 shape=(len_x, len_y, len_z)。 Elazar 和等效 kamjagin 的解决方案有效,但不是那么通用 - 您必须手动构造 [:, :, i],这意味着您需要知道维度,并且代码不够通用,无法处理任意维度的数组。您可以使用 [..., :] 之类的东西来填充缺失的维度,但您仍然需要自己构建它。
对不起,应该更清楚一点,例子有点太简单了!
【问题讨论】:
-
查看stackoverflow.com/questions/1589706/…。 swapaxes 方法是最快的,但最不清晰。 kamjagin 的方法可以通过构造一个元组传递到括号中来概括(即
data[tuple(slice(None), slice(None), i)]与data[:,:,i]相同)。 -
@AFoglia 我不认为这个问题的时间安排非常相关。使用
swapaxes或rollaxis将花费更多时间来设置循环,但实际迭代更快,请参阅添加到我的答案中的时间。在您非常小的示例中,设置在实际迭代中占主导地位。我不同意可读性,但我可能太习惯于 numpy 而没有注意到它。 -
@AFoglia numpy 有一个巧妙的技巧,可以将切片(元组)与它们要索引的对象分开构建:
numpy.s_[:,:,i]相当于tuple(slice(None), slice(None), i)。 -
(请注意
numpy.s_有一个属性maketuple,它决定使用单个切片是否会产生一个元组[即slice(start, end, step)与(slice(start, end, step),)] . 默认为False。) -
@JAB 是的,但是如果他想要针对任意秩数组的任意维度的通用解决方案,使用
(slice(None),)*(idim)+(idx,)以编程方式创建一个元组比使用:字符更容易。你不能这样做data[(:,)*(idim)+(idx,)]。