numpy python zip_numpy:压缩块矩阵

我能想到的最直接的方法是将矩阵转换为一维数组,然后为分区组索引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个副本,那么就要占用可用的内存了。在

你可能感兴趣的:(numpy,python,zip)