Matlab的accurmarray的Python转录

2024-10-06 11:20:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望得到与Matlab在Python中的accurmarray函数相同的结果。我知道还有一些其他的讨论可以为这个问题提供解决办法,但我所考虑的情况似乎更为困难。在

它对应于this Matlab script的情况,其中包含以下行:

binned_data = accumarray(bins(all(bins>0,2),:),1/nrows,M(ones(1,ncols)));

我试图通过阅读the official documentation of accumarray来理解这个计算的意义,但我不清楚。在

您是否理解这行代码的含义,并且知道如何使用Python库(numpy、scipy、pandas等)获得相同的结果?在

编辑:据我所知,我的问题与this one不同。正如您所注意到的,accumarray在我的示例中有3个输入参数,而在其他讨论的示例中只有2个输入参数。此外,在另一个讨论中没有提供accumarray用法的例子:对该函数的引用仅出现在标题中(作者仅对该函数给出了一个非常严格的定义)。在我的例子中,有一个实际的例子似乎比另一个讨论中考虑的更为普遍。在


Tags: 函数示例data参数script情况allthis
1条回答
网友
1楼 · 发布于 2024-10-06 11:20:00

我没有测试它的所有细节,但这个函数应该是你正在寻找的。它处理了Matlab函数所做的一些事情。在

def accumarray(subs, vals, size=None, fun=np.sum):

    if len(subs.shape) == 1:
        if size is None:
            size = [subs.values.max() + 1, 0]

        acc = val.groupby(subs).agg(fun)
    else:
        if size is None:
            size = [subs.values.max()+1, subs.shape[1]]

        subs = subs.copy().reset_index()
        by = subs.columns.tolist()[1:]
        acc = subs.groupby(by=by)['index'].agg(list).apply(lambda x: val[x].agg(fun))
        acc = acc.to_frame().reset_index().pivot_table(index=0, columns=1, aggfunc='first')
        acc.columns = range(acc.shape[1])
        acc = acc.reindex(range(size[1]), axis=1).fillna(0)

    id_x = range(size[0])
    acc = acc.reindex(id_x).fillna(0)

    return acc

您可以进行简单的计算,例如:

^{pr2}$

或者更复杂的事情,比如:

val = pd.Series(np.arange(101, 106+1))
subs = (pd.DataFrame([[1, 1], [2, 2], [3, 2], [1, 1], [2, 2], [4, 1]]) - 1)
accumarray(subs,val, [4, 4])

val = pd.Series(range(1, 10+1))
subs = pd.DataFrame([[1, 1], [1, 1], [1, 1], [1, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 1], [2, 2]]) - 1
accumarray(subs, val, None, list)

相关问题 更多 >