【问题标题】:Need examples for numpy basic indexing with `non-ndarray sequence`需要使用“非 ndarray 序列”进行 numpy 基本索引的示例
【发布时间】:2016-06-30 17:47:04
【问题描述】:

在关于basic slicing的numpy doc中,有一种情况描述为:

如果选择对象是包含切片对象、Ellipsis 对象或 newaxis 对象的任何非 ndarray 序列(例如列表),则也会启动基本切片,但不适用于整数数组或其他嵌入序列。

很难理解这个描述的意思。这种情况什么时候发生?你能告诉我一些关于这种情况的例子吗?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    这是一个有趣的便利。假设我有以下数组:

    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 都是切片、省略号或无。

    【讨论】:

    • 您通常希望在此处使用元组,因为如果列表不包含切片Ellipsisnp.newaxis,您会突然获得高级索引而不是基本索引。正如提问者引用的部分上面所述,非元组的这种行为是为了向后兼容。
    • @user2357112 -- 是的,这是一个公平的观点 -- 尽管我认为列表版本可能很有用(例如,如果您正在为数组的每个维度动态构建索引对象 -- 特别是如果您事先不知道数组的尺寸)
    • apply_along_axis 创建一个i = np.zeros(nd, 'O') 数组,填充它,然后通过outarr[tuple(i.tolist())] = res 使用它。
    猜你喜欢
    • 2016-01-15
    • 2018-10-10
    • 2022-10-04
    • 2017-07-27
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多