使用np.einsum的矢量化arange为raycast

时间:2017-06-30 03:56:06

标签: python numpy numpy-einsum

我有一个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?

1 个答案:

答案 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