2D numpy数组中具有重复第一个元素的平均条目

时间:2015-11-12 09:27:15

标签: python numpy

我有一个看起来像这样的数组

  arr = np.array([[0, 1], [0, 2], [1, 3], [1, 3], [1, 4], [2, 3]])

我想取具有相同第一个元素的'条目'的平均值,即我的输出应为

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

最好的方法是什么?

3 个答案:

答案 0 :(得分:3)

如果您有权访问pandas(推荐用于此类操作),则可以使用:

arr = np.array([[0, 1], [0, 2], [1, 3], [1, 3], [1, 4], [2, 3]])
pd.DataFrame(arr).groupby(0).mean()

          1
0
0  1.500000
1  3.333333
2  3.000000

如果您想再次使用numpy数组,只需使用values属性:

pd.DataFrame(arr).groupby(0).mean().values
>>> array([[ 1.5       ],
...        [ 3.33333333],
...        [ 3.        ]])

当然失去指数。但是,根据您的需要,操作结果数据帧可能更有用,而不是使用(缩短的)2D numpy数组。

(为清楚起见:

pd.DataFrame(arr)

   0  1
0  0  1
1  0  2
2  1  3
3  1  3
4  1  4
5  2  3

因此使用0作为groupby中的列索引。)

答案 1 :(得分:2)

这是一个使用np.uniquenp.bincount的NumPythonic解决方案,当第一列并不总是排序时,会使用Factory Method -

unqa,ID,counts = np.unique(arr[:,0],return_inverse=True,return_counts=True)
out = np.column_stack(( unqa , np.bincount(ID,arr[:,1])/counts ))

示例运行 -

In [4]: arr
Out[4]: 
array([[5, 1],
       [5, 2],
       [1, 3],
       [1, 3],
       [5, 4],
       [2, 3]])

In [5]: unqa,ID,counts = np.unique(arr[:,0],return_inverse=True,return_counts=True)
   ...: out = np.column_stack(( unqa , np.bincount(ID,arr[:,1])/counts ))
   ...: 

In [6]: out
Out[6]: 
array([[ 1.        ,  3.        ],
       [ 2.        ,  3.        ],
       [ 5.        ,  2.33333333]])

答案 2 :(得分:1)

您可以使用词典对项目进行分组,并在列表理解中使用np.mean()来获得预期结果:

>>> for i,j in arr:
...    d.setdefault(i,[]).append(j)
... 
>>> d
{0: [1, 2], 1: [3, 3, 4], 2: [3]}
>>> 
>>> [[i,np.mean(j)] for i,j in d.items()]
[[0, 1.5], [1, 3.3333333333333335], [2, 3.0]]

或者如果您希望数据处于舍入模式:

>>> [[i,round(np.mean(j),2)] for i,j in d.items()]
[[0, 1.5], [1, 3.33], [2, 3.0]]