获得"切片的长度" NumPy数组(或列表)没有实际切片

时间:2017-02-21 14:46:35

标签: python arrays numpy

假设我有一个NumPy数组arr,如

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

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

array([3, 6])

我想生成一个数组,其中arr 的子数组的长度为我将数组与inds分开。所以在这种情况下,我的结果是[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]的正确结果,但似乎实际分割数组是不必要的代价,因为我是只使用子阵列的大小 - 这些信息显然可以在不分割的情况下(从索引中获得),但我怎样才能有效地使用它?

1 个答案:

答案 0 :(得分:2)

一种方法,在索引数组的两边连接端点(0和数组的长度),然后使用差异来获得间隔长度 -

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]