切出一个numpy数组的部分的Pythonic方式

时间:2015-02-09 14:51:35

标签: python arrays numpy

假设您有以下numpy数组,

>>> x = numpy.array([0,1,2,3,4,5,6,7,8,9,10])

你想提取一个新的numpy数组,只包含前三(3)和最后四(4)个元素,即

>>> y = x[something]
>>> print y
[0 1 2 7 8 9 10]

这可能吗?我知道要提取前三个数字你只需要x[:3]并提取最后四个你做x[-4:],但是有一种简单的方法可以在一个简单的切片中提取所有这些吗?我知道这可以通过例如附加两个电话来完成,

 >>> y = numpy.append(x[:3],x[-4:])  

但是我想知道是否有一些简单的小技巧以更直接,更pythonic的方式来做,而不必再次引用x(即,我首先想到也许x[-4:3]可以工作但我立刻意识到它没有意义。)

4 个答案:

答案 0 :(得分:4)

一个简单的切片可能不会起作用。你可以使用numpy的扩展切片:

>>> import numpy as np
>>> a = np.arange(10)
>>> something = [0, 1, 2, -4, -3, -2, -1]
>>> a[something] 
array([0, 1, 2, 6, 7, 8, 9])

注意我传入了一个我想从原始数组中获取的索引列表...

坦率地说,您使用np.append的解决方案可能同样出色......

答案 1 :(得分:4)

我认为你应该使用index arrays

indices = list(range(3))+list(range(-4,0))
y = x[indices]

你可能会丢弃list强制转换(不确定,因为python 3稍微改变了行为)。或者你可以使用numpy范围的传感器。

编辑:不确定为什么downvote,导致it works

import numpy
x = numpy.array([0,1,2,3,4,5,6,7,8,9,10])
indices = list(range(3))+list(range(-4,0))
y = x[indices]
print(y)

答案 2 :(得分:1)

np.arange(11)[np.r_[0:3,7:11]]
# array([ 0,  1,  2,  7,  8,  9, 10])

np.r_是一个函数,实际上是numpy/lib/index_tricks中的可索引对象。它需要多个切片或索引,并将它们连接成一个索引数组。

np.r_[0:3,7:11]
# array([ 0,  1,  2,  7,  8,  9, 10])

或者从luk32的答案中借用,一个负片可行:

a[np.r_[:3,-4:0]]

拼接2部分的另一种方法是删除中间部分。 s_允许您在函数内使用切片表示法。

np.delete(np.arange(11),np.s_[3:7])
# array([ 0,  1,  2,  7,  8,  9, 10])

查看.lib.index_tricksdeleteinsert函数的代码,以获取有关如何从多个部分构造索引数组的更多想法。

有时布尔索引很方便。使它全部为真或假,并翻转所选元素。

i = np.ones(a.shape,dtype='bool')
i[3:7] = False
a[i]

答案 3 :(得分:0)

现在可以像这样使用内置函数 np.setdiff1d()

malloc

这将返回 import numpy as np x = np.asarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) x_cut_out = np.asarray([3, 4, 5, 6]) x_new = np.setdiff1d( ar1=x, ar2=x_cut_out ) 中不在 x 中的唯一值。

x_cut_out