NumPy -具有特殊元素选择的累积点积,无循环

t3irkdon  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(70)

我有两个向量a=(a1,...,a_n)和B=(b_1,...,B_n),我想构建向量c,使得
c_(k)= a_(1)B_(n-k+1)+ a_(2)B_(n-k+2)+.+ a_(k)B_(n)
例如,对于向量a=[1, 2, 3, 4]b=[5, 6, 7, 8],我期望得到:
c = [1*8, 1*7+2*8, 1*6+2*7+3*8, 1*5+2*6+3*7+4*8] = [8, 23, 44, 70]
有没有一种方法可以只使用numpy,而不使用循环?

循环示例

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
c = []
for i in range(1, len(a) + 1):
    c.append(a[:i].dot(b[-i:]))
c = np.array(c) # [ 8 23 44 107]
f0brbegy

f0brbegy1#

这个操作是a和反向b的卷积。在numpy中,你可以使用np.convolve来实现。你似乎想要一个特殊的情况,你采取前N个元素,其中N是a的长度(或b,因为我假设它们的长度相同)。这是非标准的,所以我只索引前N个元素。通常情况下,您可以使用其中一种卷积模式,例如"full"(默认),"same""valid"(这些在文档中有解释)。

import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])

c = np.convolve(a, b[::-1])[:a.shape[0]]
print(c)  # [ 8 23 44 70]

如果你有一个更大的数据集,基于FFT的卷积方法会更快。因此,根据文档,您将使用scipy.signal.fftconvolve

from scipy.signal import fftconvolve

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])

c = fftconvolve(a, b[::-1])[:a.shape[0]]
print(c)  # [ 8. 23. 44. 70.]

相关问题