PythonのNumPyの値が重複しているときの平均値を求めたい


現在、Pythonで重複する値の平均を出そうとしています。  
具体的には、

[code]

    x = np.array([0, 0, 1, 1, 1])
    y = np.array([0, 0, 1, 0, 0])
    z = np.array([2, 3, 4, 3, 6])
    
[/code]

という配列から、

[code]

    new_x = np.array([0, 1, 1])
    new_y = np.array([0, 1, 0])
    new_z = np.array([2.5, 5., 3.])
    
[/code]

もしくは

[code]

    new_x = np.array([0, 0, 1, 1, 1])
    new_y = np.array([0, 0, 1, 0, 0])
    new_z = np.array([2.5, 2.5, 5., 3., 5.])
    
[/code]

という値が欲しいです。  
`x`と`y`はインデックスの値、`z[i]`は(`x[i]`, `y[i]`)のときの値で  
`x[0] == x[1], y[0] == y[1]`なので、`new_z`の要素に`z[0]`と`z[1]`の平均を入るという処理がしたいです。  
なにかいい案はないでしょうか？




[`np.ravel_multi_index()`](https://numpy.org/doc/stable/reference/generated/numpy.ravel_multi_index.html)（あるいは[`np.unique()`](https://numpy.org/doc/stable/reference/generated/numpy.unique.html)等でも可能）を用いて、（x,
y）の二次元座標を一次元座標に変換した後、[`np.bincount()`](https://numpy.org/doc/stable/reference/generated/numpy.bincount.html)を用いて各座標の合計と総数を計算します。

例：

[code]

    def pos_means1(x, y, z):
        xy = np.ravel_multi_index([x, y], (x.max()+1, y.max()+1))
        means = np.bincount(xy, z) / np.bincount(xy)
        return means[xy]
    
    
    def pos_means2(x, y, z):
        unq, xy, cnt = np.unique([x, y], axis=1,
                                 return_inverse=True, return_counts=True)
        means = np.bincount(xy, z) / cnt
        return unq[0], unq[1], means
    
[/code]

動作：

[code]

    In [4]: x = np.array([0, 0, 1, 1, 1])
       ...: y = np.array([0, 0, 1, 0, 1])
       ...: z = np.array([2, 3, 4, 3, 6])
    
    In [5]: pos_means1(x, y, z)
    Out[5]: array([2.5, 2.5, 5. , 3. , 5. ])
    
    In [6]: pos_means2(x, y, z)
    Out[6]: (array([0, 1, 1]),
             array([0, 0, 1]),
             array([2.5, 3. , 5. ]))
    
[/code]




[`np.ravel_multi_index()`](https://numpy.org/doc/stable/reference/generated/numpy.ravel_multi_index.html)（あるいは[`np.unique()`](https://numpy.org/doc/stable/reference/generated/numpy.unique.html)等でも可能）を用いて、（x,
y）の二次元座標を一次元座標に変換した後、[`np.bincount()`](https://numpy.org/doc/stable/reference/generated/numpy.bincount.html)を用いて各座標の合計と総数を計算します。

例：

[code]

    def pos_means1(x, y, z):
        xy = np.ravel_multi_index([x, y], (x.max()+1, y.max()+1))
        means = np.bincount(xy, z) / np.bincount(xy)
        return means[xy]
    
    
    def pos_means2(x, y, z):
        unq, xy, cnt = np.unique([x, y], axis=1,
                                 return_inverse=True, return_counts=True)
        means = np.bincount(xy, z) / cnt
        return unq[0], unq[1], means
    
[/code]

動作：

[code]

    In [4]: x = np.array([0, 0, 1, 1, 1])
       ...: y = np.array([0, 0, 1, 0, 1])
       ...: z = np.array([2, 3, 4, 3, 6])
    
    In [5]: pos_means1(x, y, z)
    Out[5]: array([2.5, 2.5, 5. , 3. , 5. ])
    
    In [6]: pos_means2(x, y, z)
    Out[6]: (array([0, 1, 1]),
             array([0, 0, 1]),
             array([2.5, 3. , 5. ]))
    
[/code]

