numpy - 如何添加两个部分重叠的 numpy 数组并扩展非重叠部分?
问题描述
我正在将一个短音频信号(音符的一维 numpy 数组)添加到一个较长信号的大致末尾(到目前为止构建的音频流的第一部分)。我想添加重叠部分并扩展非重叠部分。实现这一目标的最有效方法是什么?我可以识别重叠部分并将其添加到主信号中,同时连接非重叠部分,但我认为这不够有效。我还认为通过用零填充使它们具有相同的大小是非常低效的内存。是否有实现此目的的 numpy 或 scipy 函数?
解决方案
np 数组是连续的内存块。那些a
和b
几乎可以保证彼此不连续,因此您实际上只能选择使用第二个的副本扩展一个或创建一个新对象来创建您想要的对象。
我不知道你的限制,但我怀疑你正试图过早地优化。只需先写一些清楚的东西,如果它不能满足您的任何需求,请进行优化:
def add_signal(a, b, ai=0, bi=0):
assert ai >= 0
assert bi >= 0
al = len(a)
bl = len(b)
cl = max(ai + al, bi + bl)
c = np.zeros(cl)
c[ai: ai + al] += a
c[bi: bi + bl] += b
return c
例子:
a = np.array([0, 1, 2, 3, 4, 5])
b = np.array([10, 20, 30, 40])
add_signal(a, b, bi=len(a)-3)
输出:
array([ 0., 1., 2., 13., 24., 35., 40.])
推荐阅读
- stream - jq --stream 在后台运行吗?
- javascript - Angular HttpInterceptor - 如何在发送到服务器端之前引用令牌(字符串 var)?
- node.js - 如何在 sinon 中存根回调结果?
- sql - 编写引用嵌套 VARRAY 的 SQL 语句
- wordpress - .htaccess 删除链接中的双 https:// http://
- nginx - Nginx GET攻击
- delphi - 如何将保存的树(在文件中)添加到另一棵树作为子树?
- vue.js - 在 vue 中添加键盘事件监听器
- android-studio - 使用 foo->detect 是错误的,但使用 (*foo).detect 是可以的
- ethereum - 获得一份可靠的 ERC20 代币持有者名单