我能想到的最直接的方法是将矩阵转换为一维数组,然后为分区组索引X和{}创建相应的数组,尽管可能不是最有效的(尤其是当矩阵很大时)。然后,您可以按分区分组索引分组,最后将矩阵重新构造为其原始形式。在
例如,如果矩阵是>>> M1 = np.arange(25).reshape((5,5))
>>> M1
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
你的分区是
^{pr2}$
从这一点来看,有几种方法可以实现重塑和后续分组。你可以在每一行的cd3}上为每一行建立索引。在>>> st = pd.DataFrame(M1).stack().to_frame('M1')
>>> st
M1
0 0 0
1 1
2 2
3 3
4 4
1 0 5
...
4 3 23
4 24
(为了可读性,我截断了输出,如果您想查看其余示例的输出,我相信您可以自己评估这些示例的其余部分。)然后可以添加表示分区组索引的列:>>> st['X'] = f(st.index.get_level_values(0))
>>> st['Y'] = g(st.index.get_level_values(1))
然后,您可以按这些指数分组,并应用您选择的聚合函数。在>>> stp = st.groupby(['X', 'Y']).agg(p)
您必须定义p(或找到一个现有的定义),以便它接受一维Numpy数组并返回单个数字。如果您想使用sum(),那么可以使用st.groupby(...).sum(),因为Pandas内置了对该函数和其他一些标准函数的支持,但是agg是通用的,适用于您可以提供的任何缩减函数p。在
最后,unstack()方法将数据帧转换回正确的2D“矩阵形式”,然后如果需要,可以使用as_matrix()方法将其转换回纯Numpy数组。在>>> M3 = stp.unstack().as_matrix()
>>> M3
array([[ 15, 63, 27],
[ 35, 117, 43]])
如果你不想引进熊猫,其他图书馆也会这么做。例如,您可能会看到numpy-groupies,但在我编写本文时,它似乎只与python2兼容。然而,我还没有找到任何一个真正的二维分组的库,如果你处理的是非常大的矩阵,那么你可能需要这个库,因为如果你有另外的2到3个副本,那么就要占用可用的内存了。在