python - python numpy - 有没有更快的卷积方法?
问题描述
我有一个非常大的 numpy 数组(一百万个整数)。我正在使用 np.convolve 来找到该数组的“最密集”区域。“最密集”区域是指固定长度的窗口,当窗口求和时具有最高数字。让我用代码告诉你:
import numpy as np
example = np.array([0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,1,0,0,1,1,0,1,0,0,0,0,0,1,0])
window_size = 10
density = np.convolve(example, np.ones([window_size]), mode='valid')
print(density)
# [7.0, 7.0, 8.0, 9.0, 9.0, 9.0, 8.0, 7.0, 6.0, 6.0, 5.0, 5.0, 5.0, 5.0, 4.0, 4.0, 4.0, 4.0, 4.0, 3.0, 3.0, 4.0, 3.0]
然后我可以np.argmax(density)
用来获取最高密度区域的起始索引3
。
不管怎样,这个例子运行得很快。但是当卷积超过百万个元素数组并且窗口大小为 10,000 时,需要 2 秒才能完成。如果我选择 500,000 的 windows_size,则需要 3 分钟才能完成。
有没有更好的方法来对具有特定窗口大小的数组求和以加快速度?如果我把它转换成熊猫系列,我可以在那里使用一些东西吗?
谢谢你的帮助!
解决方案
尝试使用scipy.signal.convolve
. 它可以选择使用快速傅里叶变换 (FFT) 计算卷积,对于您提到的数组大小,它应该更快。
使用example
长度为 1000000 的数组并将其与长度数组进行卷积,10000
在np.convolve
我的计算机上花费了大约 1.45 秒,scipy.signal.convolve
花费了 22.7 毫秒。
推荐阅读
- relational-database - 数据库管理系统考试题
- python-2.7 - map(None, some_list) 对 Python 2.7 中的一个列表有用吗?
- vue.js - 如何在 vue js 中使用图像创建选择选项
- xamarin - Xamarin WebView 应用程序(混合)与 Xamarin Essential
- javascript - 如何修复 JS 控制台中的“Cross-Origin Read Blocking (CORB) blocked cross-origin response”?
- filter - 试图合并两个谷歌表格过滤器功能
- c - 主函数中的第一个变量地址是否固定?
- python - SQLAlchemy 要求为查询设置别名,但在生成的 SQL 中未使用该别名
- reactjs - 尝试修复合并冲突后,如何从损坏的 node_modules 中恢复?
- django - 如何通过反向方法传递模式