如何添加两个部分重叠的numpy数组并扩展不重叠的部分?
How to add two partially overlapping numpy arrays and extend the non-overlapping parts?
我将一个短音频信号(一个音符的一维 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.])
我将一个短音频信号(一个音符的一维 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.])