有没有办法一次在numpy数组中获得多个值范围



假设我们有一个简单的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])

因此,只要您知道所需元素的位置,就可以单独访问它们。

最新更新