【发布时间】:2016-06-30 17:47:04
【问题描述】:
在关于basic slicing的numpy doc中,有一种情况描述为:
如果选择对象是包含切片对象、Ellipsis 对象或 newaxis 对象的任何非 ndarray 序列(例如列表),则也会启动基本切片,但不适用于整数数组或其他嵌入序列。
很难理解这个描述的意思。这种情况什么时候发生?你能告诉我一些关于这种情况的例子吗?
【问题讨论】:
在关于basic slicing的numpy doc中,有一种情况描述为:
如果选择对象是包含切片对象、Ellipsis 对象或 newaxis 对象的任何非 ndarray 序列(例如列表),则也会启动基本切片,但不适用于整数数组或其他嵌入序列。
很难理解这个描述的意思。这种情况什么时候发生?你能告诉我一些关于这种情况的例子吗?
【问题讨论】:
这是一个有趣的便利。假设我有以下数组:
arr = np.arange(100)
如果我很傻,我可以像这样对数组进行切片:
arr[:30, ..., np.newaxis]
(Ellipsis 在这里没有任何帮助,但我可以把它放在那里)。基本上,这告诉基本切片采用前 30 个元素,然后添加一个新轴。
如果我愿意(或者出于某种原因更方便),我可以像这样完成相同的切片:
arr[[slice(0, 30), Ellpisis, np.newaxis]]
如果我有一个二维数组:
arr = arr.reshape((10, 10))
我可以有多个切片对象:
arr[[slice(0, 5), slice(5, 10, 2)]]
所以我想一般来说,你可以认为arr[[x_0, x_1, x_2, ..., x_N]] 等同于arr[x_0, x_1, x_2, ..., x_N],只要x_0、...x_N 都是切片、省略号或无。
【讨论】:
Ellipsis 或np.newaxis,您会突然获得高级索引而不是基本索引。正如提问者引用的部分上面所述,非元组的这种行为是为了向后兼容。
apply_along_axis 创建一个i = np.zeros(nd, 'O') 数组,填充它,然后通过outarr[tuple(i.tolist())] = res 使用它。