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)
一个紧凑的解决方案是使用numpy_indexed(免责声明:我是它的作者),它实现了一个完全矢量化的解决方案:
import numpy_indexed as npi
npi.group_by(arr[:, 2]).mean(arr)
Run Code Online (Sandbox Code Playgroud)
你可以做:
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不需要对数组进行排序,并且所有中间数组都是视图(即,不是新的数据数组)。直接从这些视图中有效地计算平均值。