【发布时间】:2019-08-31 13:21:25
【问题描述】:
我的问题类似这样:subsampling every nth entry in a numpy array
假设我有一个数组,如下所示: a = [1,2,2,2,3,4,1,2,2,2,3,4,1,2,2,2,3,4....]
如何扩展切片以便以特定间隔切片三个元素? IE。如何从数组中切片 2s? 我相信基本切片在这种情况下不起作用。
【问题讨论】:
我的问题类似这样:subsampling every nth entry in a numpy array
假设我有一个数组,如下所示: a = [1,2,2,2,3,4,1,2,2,2,3,4,1,2,2,2,3,4....]
如何扩展切片以便以特定间隔切片三个元素? IE。如何从数组中切片 2s? 我相信基本切片在这种情况下不起作用。
【问题讨论】:
您可以通过单独的索引来做到这一点。
我们要从索引为 1 的元素开始,取 3 个元素,然后跳过 3 个元素:
a = np.array([1, 2, 2, 2, 3, 4, 1, 2, 2, 2, 3, 4, 1, 2, 2, 2, 3, 4])
start = 1
take = 3
skip = 3
indices = np.concatenate([np.arange(i, i + take) for i in range(start, len(a), take + skip)])
print(indices)
print(a[indices])
输出:
[ 1 2 3 7 8 9 13 14 15]
[2 2 2 2 2 2 2 2 2]
【讨论】:
这里似乎最简单:
a = np.array([1,2,2,2,3,4,1,2,2,2,3,4,1,2,2,2,3,4])
a.reshape(-1,6)[1:4].ravel()
或者如果a 不能很好地分块:
period = 6
a.resize(np.math.ceil(a.size/period),period)
a[:,1:4].ravel()
【讨论】:
这是一个带有masking 的矢量化文件-
def take_sliced_regions(a, start, take, skip):
r = np.arange(len(a))-start
return a[r%(take+skip)<take]
示例运行 -
In [90]: a = np.array([1,2,2,2,3,4,1,2,2,2,3,4,1,2,2,2,3,4,1,2])
In [91]: take_sliced_regions(a, start=1, take=3, skip=3)
Out[91]: array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
【讨论】: