较短数组与较长数组在偏移索引处与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))
这只是使用正确的索引。
假设我有一个一维数组 a
:
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
和一个更短的一维乘法因子数组 b
[1, 0.66, 0.33, 0] - 我想用它与 a
的最后一个元素相乘;因此,在这种情况下,从 a
:
[ 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))
这只是使用正确的索引。