在numpy中索引多个非相邻范围

44

我希望从一个1D的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

有没有简单的方法来做这件事,或者我需要分别生成它们然后进行拼接?

1个回答

65
你需要连接,可以在索引之前或之后进行。 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])

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


1
注意:我尝试使用np.r_而没有完全指定索引,即np.r_[:3,7:],结果非常奇怪。通过完全指定起始和结束索引(np.r_[0:3,7:10])使用它可以按预期工作。 - BlueCoder
1
@BlueCoder,在正常索引中,[7:]stop值可以从被索引的数组/列表中推导出来。 r_无法做到这一点。 它似乎将7视为stop而不是start。 另一种选择是引发错误。 请查看r_代码以获取详细信息。 在使用r_时最好同时提供startstop - hpaulj
1
@hpaulj 那对于一个二维数组会怎么样呢?比如说我想要针对每一列不相邻的行范围。那该怎么做呢? - xicocaio
@CodeNoob 我曾经提出了一个关于非相邻行范围的二维数组情况的问题,并在这里得到了一个相当不错的答案 - xicocaio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接