【问题标题】:Index multiple, non-adjacent ranges in numpy在numpy中索引多个不相邻的范围
【发布时间】:2016-03-15 07:19:30
【问题描述】:

我想从一维 numpy 数组(或向量)中选择多个不相邻的范围。

假设:

>>> idx = np.random.randint(100, size=10)
array([82,  9, 11, 94, 31, 87, 43, 77, 49, 50])

这当然可行:

>>> idx[0:3]
array([82,  9, 11])

这可以通过单个索引获取:

>>> idx[[0,3,4]]
array([82, 94, 31])

但是如果我想选择0:37: 范围呢?

我试过了:

>>> idx[[0:3,7:]]
SyntaxError: invalid syntax

有没有一种简单的方法可以做到这一点,还是我需要单独生成它们并连接起来?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您需要在索引之前或之后进行连接。 np.r_ 让一切变得简单

    In [116]: idx=np.array([82,  9, 11, 94, 31, 87, 43, 77, 49, 50])
    In [117]: np.r_[0:3,7:10]
    Out[117]: array([0, 1, 2, 7, 8, 9])
    In [118]: idx[np.r_[0:3,7:10]]
    Out[118]: array([82,  9, 11, 77, 49, 50])
    

    np.r_ 扩展切片并将它们连接起来。

    您可以混合使用切片和列表:

    In [120]: np.r_[0:3,7:10,[0,3,4]]
    Out[120]: array([0, 1, 2, 7, 8, 9, 0, 3, 4])
    

    在索引之前连接可能比在索引之后更快,但是对于像这样的一维数组,我认为差异并不显着。

    【讨论】:

    • 注意:我尝试使用 np.r_ 而不完全指定索引,即 np.r_[:3,7:] 结果很奇怪。通过完全指定开始和结束索引 (np.r_[0:3,7:10]) 来使用它按预期工作。
    • @BlueCoder,在正常索引中,[7:]stop 值可以从索引的数组/列表中推导出来。 r_ 不能那样做。看起来它将7 视为stop 而不是start。另一种方法是引发错误。检查r_ 代码以了解详细信息。使用r_时最好同时提供startstop
    • @hpaulj 这对二维数组有什么作用?假设我想要特定于每一列的不同的非相邻行范围。这将如何运作?
    • @CodeNoob 我问了一个关于不相邻行范围的二维数组的问题,收到了pretty good answer here
    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 2022-11-14
    • 2018-05-11
    • 2021-06-13
    • 2022-11-06
    • 1970-01-01
    • 2020-05-11
    • 2019-02-27
    相关资源
    最近更新 更多