使用 np.einsum 进行光线投射的矢量化排列

Vectorized arange using np.einsum for raycast

我有一个D维的点和向量,分别为p和v,一个正数n,一个分辨率。

我想在连续将向量 v*resolution 添加到点 p n/resolution 次后得到所有点。

示例

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

这是一种利用 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