我的问题与此类似: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 ....]
如何扩展切片,以便以特定间隔切片三个元素?即如何从数组中切片2s? 我相信在这种情况下基本切片是行不通的。
答案 0 :(得分:3)
您可以通过单个索引进行操作。
我们要从索引1的元素开始,取3个元素,然后跳过3个元素:
PickupDateTime Amount2 DifferenceToPrevious Amount2_18h Rows_18 Amount2_22h Rows_22
2019-04-02 04:44:19.000 6458 0d 00:13:17:000 13388 3 16854 4
2019-04-02 04:31:02.000 5385 0d 02:34:50:000 6930 2 10396 3
2019-04-02 01:56:12.000 1545 0d 18:06:18:000 1545 1 12516 3
2019-04-01 07:49:54.000 3466 1d 02:23:51:000 3466 1 3466 1
2019-03-31 05:26:03.000 7505 0d 00:13:53:000 13751 3 16742 4
2019-03-31 05:12:10.000 5080 0d 03:28:18:000 6246 2 9237 3
2019-03-31 01:43:52.000 1166 0d 18:02:49:000 1166 1 4157 2
2019-03-30 07:41:03.000 2991 1d 02:39:49:000 2991 1 2991 1
2019-04-01 04:56:21.000 9518 1d 23:52:21:000 9518 1 9518 1
2019-03-30 05:04:00.000 9638 2d 00:34:29:000 9638 1 9638 1
2019-03-28 04:29:31.000 9499 1d 23:28:47:000 9499 1 9499 1
2019-03-26 05:00:44.000 10117 2d 00:03:41:000 10117 1 10117 1
2019-03-24 04:57:03.000 9933 1d 23:50:06:000 9933 1 9933 1
2019-03-22 05:06:57.000 9869 2d 00:25:01:000 9869 1 9869 1
输出:
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 :(得分:3)
这里最简单的似乎是:
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()
答案 2 :(得分:2)
这里是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])