在特定索引处将 numpy 数组的元素增加 1(用于对 astropy table 进行分组)

Increase a numpy array's elements by 1 at particular indices (for use with grouping an astropy table)

这可能不是标题中最好的描述,但我希望可以在下面描述我的问题。它实际上有两个部分。

我想要做的最终事情是将某些时间分组在一个星形中 table - 因为每次进入特定组的值都不相同,我不相信我可以在 group_by() 方法中给出列名。

所以,我想做的是生成一个数组,描述每次关联的组,以便我可以将其传递给 group_by()。我可以通过执行获得 bin 边缘,例如(10 是任意的),

>>> np.where(np.diff(table['Times']) > 10)[0]
array([ 2,  8, 9, 12])

假设 table 的长度为 15。我想知道的是如何使用上面的数组创建以下数组而不必使用循环

array([0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4])

这样,当我将该数组放入 group_by() 方法时,它会根据这些 bin 边缘对 table 进行分组。

或者,如果有更好的方法根据时间范围对星体进行分组table。

一种方法 np.repeat -

def repeat_based(bin_edges, n):
    reps = np.diff(np.hstack((-1,bin_edges,n-1)))
    return np.repeat(np.arange(bin_edges.size+1),reps)

另一种方法 np.cumsum -

def cumsum_based(bin_edges, n):
    id_arr = np.zeros(n,dtype=int)
    id_arr[bin_edges+1] = 1 
    return id_arr.cumsum()

样本运行-

In [400]: bin_edges = np.array([ 2,  8, 9, 12])

In [401]: repeat_based(bin_edges, n = 15)
Out[401]: array([0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4])

In [402]: cumsum_based(bin_edges, n = 15)
Out[402]: array([0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 4])

听起来 np.digitize 应该做你想做的事。使用 arr 代替 table,试试

arr = np.array([1,2,3,15, 16, 17, 17, 18, 19, 30,41,42, 43, 55, 56])
bin_edges = arr[np.where(np.diff(arr) > 10)[0]]
indices = np.digitize(arr, bin_edges, right=True)
print indices