获得numpy数组模式的最快方法是什么

Hel*_*eli 2 numpy scipy

我必须找到从 hdf5 文件中读取的 NumPy 数组的模式。NumPy 数组是 1d,包含浮点值。

my_array=f1[ds_name].value    
mod_value=scipy.stats.mode(my_array)
Run Code Online (Sandbox Code Playgroud)

我的数组是 1d,包含大约 1M 个值。我的脚本需要大约 15 分钟才能返回模式值。有什么办法可以让它更快吗?

另一个问题是为什么scipy.stats.median(my_array)模式有效时不起作用?

AttributeError: 模块 'scipy.stats' 没有属性 'median'

War*_*ser 6

的实现scipy.stats.mode有一个 Python 循环,用于处理axis多维数组的参数。以下简单实现,仅适用于一维数组,速度更快:

def mode1(x):
    values, counts = np.unique(x, return_counts=True)
    m = counts.argmax()
    return values[m], counts[m]
Run Code Online (Sandbox Code Playgroud)

这是一个例子。首先,创建一个长度为 1000000 的整数数组。

In [40]: x = np.random.randint(0, 1000, size=(2, 1000000)).sum(axis=0)

In [41]: x.shape
Out[41]: (1000000,)
Run Code Online (Sandbox Code Playgroud)

检查scipy.stats.modemode1给出相同的结果。

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)
Run Code Online (Sandbox Code Playgroud)

现在检查性能。

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)
Run Code Online (Sandbox Code Playgroud)

2.91 秒mode(x),仅 39.6 毫秒mode1(x)