使用:用于列表或 numpy 数组中的多个切片

Posted

技术标签:

【中文标题】使用:用于列表或 numpy 数组中的多个切片【英文标题】:Using : for multiple slicing in list or numpy array 【发布时间】:2017-04-19 14:33:33 【问题描述】:

我很难弄清楚如何在列表中提取多个值,这些值间隔一些索引。例如,给定一个列表l = [0,1,2,3,4,5,6,7,8,9,10],我只想提取值[1,2,3] and [6,7,8,9]。我可以写l[1:4]+l[6:-1],但是有没有办法写l[1:4,6:-1]

对于我在熊猫数据框中遇到的实际问题,这确实是一个幽灵问题。我有一个数据框df,列有['A','B','C','I1','D','E','F','I2','I3'],我只想保留重要的列['I1', 'I2', 'I3']。现在,我正在做的当前方法是

df.drop(df.columns[0:3], axis=1, inplace=True) df.drop(df.columns[4:7], axis=1, inplace=True)

有没有办法做到这一点,我们可以在 1 行中完成,而无需显式写出列值?

谢谢! PS。我知道 pandas 数据帧使用 numpy,我也没有在 numpy 中找到任何解决方法,但我认为删除列的语法是标准的 python 列表格式,如果这有意义的话。

编辑:我为 numpy 找到了一种方法,但它也是 2 行,来自 this question。我们可以这样做:indices = np.hstack((np.arange(0:3), np.arange(4:7))df.drop(df.columns[indices], axis=1, inplace=True)

但是,我仍在寻找 1 行通用方法。

【问题讨论】:

【参考方案1】:

我认为您需要 numpy.r_ 来获取连接索引:

print (np.r_[1:4, 6:10])
[1 2 3 6 7 8 9]

【讨论】:

啊,我明白了!哇,index_tricks 充满了东西。所以这只适用于numpy数组?内置python没有这样的东西吗? 嗨,numpy.r_ 函数不适用于[1:4, 6:-1],因为它没有任何 numpy 数组可供参考。这意味着我们必须使用[1:4, 6:array.shape[0]-1] 是的,完全正确。另一个可能的解决方案是[1:4, 6:len(array)-1] r_ 将切片扩展为索引数组。这样的数组不能用于索引列表,至少在没有循环或理解的情况下不能。 是的,但是您可以使用iloc 进行选择。【参考方案2】:

使用列表推导,您可以:

>>> [item for item in l[1:4] + l[6:-1]]
[1, 2, 3, 6, 7, 8, 9]

你也可以像这样使用extend()

>>> res = l[1:4]
>>> res.extend(l[6:-1])
>>> res
[1, 2, 3, 6, 7, 8, 9]

【讨论】:

以上是关于使用:用于列表或 numpy 数组中的多个切片的主要内容,如果未能解决你的问题,请参考以下文章

如何分配 Numpy 数组的特定部分?

像在 numpy 中一样使用 tf.slice 检测越界切片

Numpy - 从数组中切片二维行或列向量

002.Numpy入门

一次从 numpy 数组中选择多个切片

用想要的行列表切片 numpy 数组