较短数组与较长数组在偏移索引处与numpy的元素相乘?

Elementwise multiplication of shorter array with longer one at an offset index with numpy?

假设我有一个一维数组 a:

[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.]

和一个更短的一维乘法因子数组 b [1, 0.66, 0.33, 0] - 我想用它与 a 的最后一个元素相乘;因此,在这种情况下,从 a:

的索引 6(从 0 开始)开始
[                                1.   0.66 0.33 0.]

...获得:

[  1.0  2.0  3.0  4.0  5.0  6.0  7.0  5.33 3.0  0.0]

...基本上,一维 "fade out"。我可以用普通的 Python 代码来做到这一点:

import numpy as np

a = np.linspace(1, 10, 10)
print(a)
# [  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.]

b = np.linspace(1, 0, 4)
print(b)
# [ 1.          0.66666667  0.33333333  0.        ]

# multiply last 4 elements of 'a' element-wise with 'b':
res = []
insertAt = len(a)-len(b) # 6; lendiff
for inda, anum in enumerate(a):
  if inda < insertAt:
    res.append(anum)
  else:
    res.append(anum*b[inda-insertAt])

print(res)
# [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 5.3333333333333339, 3.0000000000000004, 0.0]

...但是我如何在 Numpy 向量化单行中执行此操作?我想使用类似的东西:

res = np.XXX( ... a, ... b, ...)

... 并得到结果,同时既不改变 a 也不改变 b,也不做任何多余的调整大小操作。这可能与 numpy 吗?此处使用较旧的 Numpy v. 1.5.1,但也欢迎提供有关较新版本的答案...

使用第二个数组的长度取第一个数组的负切片,并将该切片与第二个数组相乘:

>>> arr1 = np.arange(1, 11, dtype=float)
>>> arr2 = np.linspace(1, 0, 4)
>>> res = arr1.copy()
>>> res[-arr2.size:] *= arr2
>>> res
array([ 1.        ,  2.        ,  3.        ,  4.        ,  5.        ,
        6.        ,  7.        ,  5.33333333,  3.        ,  0.        ])

有两种可能的方法:

import numpy as np

a = np.arange(1,11)
b = np.linspace(1, 0, 4)
a * np.hstack((np.ones(a.size - b.size), b))

或者,从计算的角度来看哪个更好:

np.hstack((a[:-b.size], a[-b.size:]*b))

这只是使用正确的索引。