配列要素のサブセットの積を返す関数を作成しようとしています。prod_by_group
基本的に、これを行う関数を作成したいと思います。
values = np.array([1, 2, 3, 4, 5, 6])
groups = np.array([1, 1, 1, 2, 3, 3])
Vprods = prod_by_group(values, groups)
そして、結果Vprods
は次のようになります。
Vprods
array([6, 4, 30])
https://stackoverflow.com/a/4387453/1085691に似ているはずの要素の合計について、ここに素晴らしい答えがあり ます。
log
最初に、次にsum_by_group
、次に、をとってみましexp
たが、数値の問題に遭遇しました。
グループごとの要素の最小値と最大値について、他にも同様の回答がいくつかあります: https ://stackoverflow.com/a/8623168/1085691
編集:迅速な回答をありがとう!私はそれらを試しています。できるだけ速くしたいということを付け加えておきます(これが、私が示した例のように、ベクトル化された方法でnumpyで取得しようとしている理由です)。
編集:私はこれまでに与えられたすべての答えを評価しました、そして最も良いものは以下の@sebergによって与えられます。これが私が使用することになった完全な関数です:
def prod_by_group(values, groups):
order = np.argsort(groups)
groups = groups[order]
values = values[order]
group_changes = np.concatenate(([0], np.where(groups[:-1] != groups[1:])[0] + 1))
return np.multiply.reduceat(values, group_changes)