scipy.stats.mode
的实现在处理多维数组时使用了Python循环以处理axis
参数。对于仅限一维数组的情况,以下简单实现更快:
该函数的实现在处理多维数组时需要使用Python循环来处理axis
参数。对于仅限一维数组的情况,下面这个简单的实现更快:
def mode1(x):
values, counts = np.unique(x, return_counts=True)
m = counts.argmax()
return values[m], counts[m]
以下是一个例子。首先,创建一个长度为1000000的整数数组。
In [40]: x = np.random.randint(0, 1000, size=(2, 1000000)).sum(axis=0)
In [41]: x.shape
Out[41]: (1000000,)
检查scipy.stats.mode
和mode1
是否给出相同的结果。
In [42]: from scipy.stats import mode
In [43]: mode(x)
Out[43]: ModeResult(mode=array([1009]), count=array([1066]))
In [44]: mode1(x)
Out[44]: (1009, 1066)
现在检查性能。
In [45]: %timeit mode(x)
2.91 s ± 18 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [46]: %timeit mode1(x)
39.6 ms ± 83.8 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
mode(x)
需要2.91秒,而mode1(x)
仅需要39.6毫秒。