我有一个D维点和矢量,p和v,分别为正数n和分辨率。
我希望在连续添加矢量v *分辨率到点p n /分辨率时间后得到所有点。
实施例
p = np.array([3, 5])
v = np.array([-1.5, 3])
n = 10
resolution = 1.5
result:
[[ 3. , 5. ],
[ 0.75, 9.5 ],
[ -1.5 , 14. ],
[ -3.75, 18.5 ],
[ -6. , 23. ],
[ -8.25, 27.5 ],
[-10.5 , 32. ]]
我目前的方法是将范围(由n和分辨率给定)平铺尺寸D,乘以v并添加p。
def getPoints(p, v, n, resolution=1.):
dRange = np.tile(np.arange(0, n, resolution), (v.shape[0],1))
return np.multiply(v.reshape(-1,1), dRange).T + p
是否有直接的方法使用np.einsum或其他方法计算DRange?
答案 0 :(得分:1)
方法#1
这是一种利用NumPy broadcasting
-
np.arange(0, n, resolution)[:,None] * v + p
基本上,我们将范围数组扩展为2D
,将第二个数组保持为singleton
,让它广播以针对1D
v
进行元素乘法,给我们一个2D
数组。然后,我们向其添加p
。
方法#2
这里没有任何总和减少,所以np.einsum
或任何基于点的功能即使应该有效,但不会对性能提供任何帮助。无论如何,让我们把它说出来,就像问题中提到的那样 -
np.einsum('i,j->ij',np.arange(0, n, resolution), v) + p