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

时间:2015-01-22 23:11:04

标签: python arrays numpy

我们说我有一维数组a

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

和一个较短的1-D乘法因子数组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]

......基本上,1-D"淡出"。我可以使用普通的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, ...)

...并获得结果,同时不会同时更改ab,也不会执行任何多余的调整大小操作。 numpy有可能吗?在这里使用较旧的Numpy v.1.5.1,但也欢迎有关新版本的答案......

2 个答案:

答案 0 :(得分:6)

使用第二个数组的长度和第二个数组的多个切片取第一个数组的负片:

>>> 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.        ])

答案 1 :(得分:2)

有两种可能的方式:

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))

仅仅是使用正确的指数。