通过多重索引/分组解开

0 投票
0 回答
57 浏览
提问于 2025-04-12 00:07

我有一个numpy数组,还有对应的行和列索引:

mat = np.array([[0, 1, 2], 
                [3, 4, 5], 
                [6, 7, 8]])

row_idx = np.array([0, 0, 0, 
                    0, 0, 0,
                    1, 1, 1])

col_idx = np.array([0, 1, 2,
                    0, 1, 2,
                    0, 1, 2])

我想根据row_idx和col_idx指定的分组来展开这个矩阵:

result = np.array([0, 3, 1, 4, 2, 5, 6, 7, 8])

我可以用numpy_groupies.aggregate()来做到这一点,但返回的结果有时会很奇怪:

import numpy as np
import numpy_groupies as npg

mat = np.array([[0, 1, 2], 
                [3, 4, 5], 
                [6, 7, 8]])

row_idx = np.array([0, 0, 0, 
                    0, 0, 0,
                    1, 1, 1])

col_idx = np.array([0, 1, 2,
                    0, 1, 2,
                    0, 1, 2])


result = npg.aggregate(group_idx=np.vstack([row_idx, col_idx]), a=mat.reshape(-1), func='array')

Produces: 

[[array([0, 3]) array([1, 4]) array([2, 5])]
 [array([6]) array([7]) array([8])]]

我试过使用numpy_groupies包里的aggregate(),但它既慢又会返回一个混合了np.arrays和整数的数组,在某些情况下还可能包含整数而不是数组(这让后续处理变得困难且缓慢)。

为什么ravel不管用

ravel的问题在于,它不能处理那种矩阵中有些区域是按行分组,有些区域是按列分组的情况,这种分组是基于row_idx和col_idx的。也就是说,可能会同时存在行和列的分组。

0 个回答

暂无回答

撰写回答