2017-01-07 9 views
3

これはおそらくタイトルの中で最高の説明ではありませんでしたが、私はうまくいけば私の問題を以下で説明することができます。実際には2つの部分があります。特定のインデックスでnumpy配列の要素を1つ増やす(astropyテーブルをグループ化するのに使用)

私がしようとしている究極のことは、アストロテーブル内で特定の時間を一緒にグループ化することです - 値が特定のグループに入るたびに同じではないため、 group_by()メソッドの列名。

だから、私は何をやろうとしていることは、私は()をGROUP_BYすることを渡すことができるようにするたびに関連付けることがでどのグループ記述する配列を生成しています。私はのテーブルは、私が知りたいのは何の長さ15は、に上記のその配列を使用することが可能であるかもしれない方法ですしているとしましょう

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

、(10は任意である)は、例えば、実行することにより、ビンのエッジを得ることができますループ

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

を使用することなく、次の配列を作成するように私はそれらのビンのエッジに係るGROUP_BY()メソッドでグループテーブルをそのアレイを配置します。

また、時間範囲に従ってアストロテーブルをグループ化するより良い方法がある場合は、 np.cumsum

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.repeat

答えて

2

np.digitizeはあなたが欲しいものを行う必要がありますように聞こえます。あなたのテーブルの代わりにarrを使用して、試してください

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 
2

一つのアプローチ

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]) 
関連する問題