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