我必须找到从 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'
的实现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.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)
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)。