假设我们有一个简单的1D ndarray。即:
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9,10])
我想得到前3个和后2个值,这样输出就会是[ 1 2 3 9 10]
。
我已经通过合并和连接合并的变量解决了这个问题,如下所示:
b= a[:2]
c= a[-2:]
a=np.concatenate([b,c])
然而,我想知道是否有更直接的方法可以使用切片来实现这一点,例如a[:2 and -2:]
。作为替代方案,我已经尝试过了:
a = a[np.r_[:2, -2:]]
但它似乎不起作用。它只返回[1 2]
的前两个值。。
提前感谢!
分割numpy数组需要是连续的AFAIK。np.r_[-2:]
不工作,因为它不知道数组a
有多大。您可以执行np.r_[:2, len(a)-2:len(a)]
,但这仍然会复制数据,因为您正在使用另一个数组进行索引。
如果您想避免复制数据或进行任何串联操作,可以使用np.lib.stride_tricks.as_strided
:
ds = a.dtype.itemsize
np.lib.stride_tricks.as_strided(a, shape=(2,2), strides=(ds * 8, ds)).ravel()
输出:
array([ 1, 2, 9, 10])
但是,由于您想要第一个3和最后一个2值,因此访问元素的步长将不相等。这有点棘手,但我想你可以这样做:
np.lib.stride_tricks.as_strided(a, shape=(2,3), strides=(ds * 8, ds)).ravel()[:-1]
输出:
array([ 1, 2, 3, 9, 10])
尽管如此,这是一个潜在的危险操作,因为最后一个元素正在分配的内存之外读取。
事后我想,如果不以某种方式复制数据,我就无法找到执行此操作的方法。上面代码片段中的numpyravel
被强制制作数据的副本。如果您可以使用形状(2,2)
或(2,3)
,在某些情况下它可能会起作用,但您对跨步视图只有读取的权限,这应该通过设置关键字writeable=False
来强制执行。
您可以尝试使用索引列表访问元素。
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9,10])
b = a[[0,1,2,8,9]] # b should now be array([ 1, 2, 3, 9, 10])
显然,如果您的数组太长,则不希望键入所有索引。因此,您可以从for循环构建内部索引列表。类似的东西:
index_list = [i for i in range(3)] + [i for i in range(8, 10)]
b = a[index_list] # b should now be array([ 1, 2, 3, 9, 10])
因此,只要您知道所需元素的位置,就可以单独访问它们。