我有一个看起来像这样的数组
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] ]
最好的方法是什么?
答案 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.unique
和np.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]]