假设您有以下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]
可以工作但我立刻意识到它没有意义。)
答案 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_tricks
,delete
和insert
函数的代码,以获取有关如何从多个部分构造索引数组的更多想法。
有时布尔索引很方便。使它全部为真或假,并翻转所选元素。
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