组和平均Numpy矩阵

Alg*_*thm 10 python grouping numpy average matrix

假设我有一个看起来像这样的任意numpy矩阵:

arr = [[  6.0   12.0   1.0]
       [  7.0   9.0   1.0]
       [  8.0   7.0   1.0]
       [  4.0   3.0   2.0]
       [  6.0   1.0   2.0]
       [  2.0   5.0   2.0]
       [  9.0   4.0   3.0]
       [  2.0   1.0   4.0]
       [  8.0   4.0   4.0]
       [  3.0   5.0   4.0]]
Run Code Online (Sandbox Code Playgroud)

什么是平均按第三列编号分组的行的有效方法?

预期的产出是:

result = [[  7.0  9.33  1.0]
          [  4.0  3.0  2.0]
          [  9.0  4.0  3.0]
          [  4.33  3.33  4.0]]
Run Code Online (Sandbox Code Playgroud)

Eel*_*orn 8

一个紧凑的解决方案是使用numpy_indexed(免责声明:我是它的作者),它实现了一个完全矢量化的解决方案:

import numpy_indexed as npi
npi.group_by(arr[:, 2]).mean(arr)
Run Code Online (Sandbox Code Playgroud)


daw*_*awg 5

你可以做:

for x in sorted(np.unique(arr[...,2])):
    results.append([np.average(arr[np.where(arr[...,2]==x)][...,0]), 
                    np.average(arr[np.where(arr[...,2]==x)][...,1]),
                    x])
Run Code Online (Sandbox Code Playgroud)

测试:

>>> arr
array([[  6.,  12.,   1.],
       [  7.,   9.,   1.],
       [  8.,   7.,   1.],
       [  4.,   3.,   2.],
       [  6.,   1.,   2.],
       [  2.,   5.,   2.],
       [  9.,   4.,   3.],
       [  2.,   1.,   4.],
       [  8.,   4.,   4.],
       [  3.,   5.,   4.]])
>>> results=[]
>>> for x in sorted(np.unique(arr[...,2])):
...     results.append([np.average(arr[np.where(arr[...,2]==x)][...,0]), 
...                     np.average(arr[np.where(arr[...,2]==x)][...,1]),
...                     x])
... 
>>> results
[[7.0, 9.3333333333333339, 1.0], [4.0, 3.0, 2.0], [9.0, 4.0, 3.0], [4.333333333333333, 3.3333333333333335, 4.0]]
Run Code Online (Sandbox Code Playgroud)

arr不需要对数组进行排序,并且所有中间数组都是视图(即,不是新的数据数组)。直接从这些视图中有效地计算平均值。