按值分组和汇总矩阵

3

我有两个矩阵,probtotalHigh,它们的形状都是 axbxcxd。其中,ab 是坐标。以下是两个示例:

In [77]: prob[1,1,:]
Out[77]: 
array([[ 0.09,  0.01,  0.  ,  0.  ,  0.  ],
       [ 0.81,  0.09,  0.  ,  0.  ,  0.  ],
       [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ]])

In [78]: totalHigh[1,1,:]
Out[78]: 
array([[0, 1, 2, 3, 4],
       [1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6]])

totalHigh 包含有关结果的信息,但不幸的是涉及两个维度。相应地,prob 包含这些结果的概率。例如,在坐标 1,1 的结果 1 的总概率为 0.01+0.81

我该如何去除冗余的维度?

期望结果

simplifiedHigh[1,1,:]
array([0, 1, 2, 3, 4, 5, 6])
simplifiedProb[1,1,:]
array([0.09, 0.82, 0.09, 0, 0, 0, 0])

我该如何以最有效的方式获取它?
1个回答

4

您可以使用np.bincountnp.unique函数来实现。

IDs = np.unique(totalHigh_sliced)
counts = np.bincount(totalHigh_sliced.ravel(),prob_sliced.ravel())

样例运行 -

In [215]: prob_sliced
Out[215]: 
array([[ 0.09,  0.01,  0.  ,  0.  ,  0.  ],
       [ 0.81,  0.09,  0.  ,  0.  ,  0.  ],
       [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ]])

In [216]: totalHigh_sliced
Out[216]: 
array([[0, 1, 2, 3, 4],
       [1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6]])

In [217]: IDs = np.unique(totalHigh_sliced)
     ...: counts = np.bincount(totalHigh_sliced.ravel(),prob_sliced.ravel())
     ...: 

In [218]: IDs
Out[218]: array([0, 1, 2, 3, 4, 5, 6])

In [219]: counts
Out[219]: array([ 0.09,  0.82,  0.09,  0.  ,  0.  ,  0.  ,  0.  ])

我正要提交相同的答案 :P 另一个选择是使用binned_statistics,但由于OP只需要总和,bincount可能更快。 - Imanol Luengo
@imaluengo 是的,从我的经验来看,bincount 确实非常快! - Divakar
是否有一种高效的方法可以针对整个矩阵进行操作,还是我必须迭代前两个维度? - FooBar
@FooBar 你在第一和第二维度上是否有相同的 totalHigh[1,1,:]?如果没有,我认为迭代是有意义的。 - Divakar
@Divakar 如果实际上是一样的呢? - FooBar
@FooBar 如果是这样的话,你可以使用np.add.reduceat以矢量化的方式处理整个数组。 - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接