2017-02-21 87 views
1

假设我有一个与NumPy阵列arr获取NumPy的阵列(或清单)的“片”的长度没有实际切片

array([5, 3, 0, 5, 7, 6, 5, 9, 0, 6]) 

和一些包含在另一个数组的索引,inds

array([3, 6]) 

我要生成arr子阵列长度的数组中我与拆我的数组。所以在这种情况下,我的结果是[3, 3, 4]


我知道,我可以用np.split

>>> np.split(arr, inds) 
[array([5, 3, 0]), array([5, 7, 6]), array([5, 9, 0, 6])] 

和地图size()得到的[3, 3, 4]从那里正确的结果,但它似乎想不必要的成本实际上分裂阵列考虑到我只是使用子阵列的大小 - 这些信息显然没有分裂(来自指数),但我怎样才能有效地使用它?与索引阵列的两侧端点(0和阵列的长度)并置

回答

2

的一种方法,然后使用分化来获得间隔长度 -

np.diff(np.concatenate(([0], inds, [arr.size]))) 

较短替代 -

np.diff(np.r_[0, inds, arr.size]) 

为了提高性能,我们可以用one-off shifted slices之间的差异与np.diff更换分化 -

inds_ext = np.concatenate(([0], inds, [arr.size])) 
out = inds_ext[1:] - inds_ext[:-1] 
+0

啊这是有道理的,只需放置端点,然后很容易。谢谢Divakar! –