numpy中的累积模式

时间:2015-07-24 15:27:35

标签: numpy scipy

我想在numpy中有效地计算沿轴的累积模式。

e.g。

>>> arr = np.random.RandomState(3).randint(3, size = (2, 5))
>>> arr
array([[2, 0, 1, 0, 0],
       [0, 1, 1, 2, 1]])
>>> assert np.array_equal(cummode(arr, axis = 1), [[2,2,2,0,0],[0,0,1,1,1])

有一种有效的方法吗?我猜它可以通过返回第一个数字来处理关系,以达到给定的数量。

2 个答案:

答案 0 :(得分:1)

这是一个纯Python函数,可以在列表或任何可迭代的函数上运行:

from collections import defaultdict

def cummode(alist):
    dd = defaultdict(int)
    mode = [(None,0)]
    for i in alist:
        dd[i] += 1
        if dd[i]>mode[-1][1]:
            newmode = (i,dd[i])
        else:
            newmode = mode[-1]
        mode.append(newmode)
    mode.pop(0)
    return mode, dd

mode,dd = cummode([0,1,3,6,1,2,3,3,2,1,10,0])
print(dd)
print(mode)

对于测试用例,产生

defaultdict(<type 'int'>, {0: 2, 1: 3, 2: 2, 3: 3, 6: 1, 10: 1})
[(0, 1), (0, 1), (0, 1), (0, 1), (1, 2), (1, 2), (1, 2), (3, 3), (3, 3), (3, 3), (3, 3), (3, 3)]

当您事先不知道所有密钥时,detaultdict是一种快速累积值的方法。对于小型列表和数组,它可能胜过基于numpy的版本,即使使用weave,也只是因为它不会带来创建数组的开销。但是对于大型的它可能会滞后。另外,我还没有将其概括为处理多个值(行)。

答案 1 :(得分:0)

好吧,它不是完全一般的,因为它不会沿着任何轴工作,但是现在我已经制作了一个使用scipy-weave工作的版本。

HttpResponseMessage