我有一个 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
这是一种利用 NumPy broadcasting
的方法-
np.arange(0, n, resolution)[:,None] * v + p
基本上,我们将范围数组扩展到2D
,将第二个数组保留为单例
,以让它针对1D
进行元素乘法广播v
,给我们一个2D
数组。然后,我们向其中添加 p
。
方法#2
这里没有任何求和减少,因此 np.einsum 或任何基于点的函数尽管应该可以工作,但不会对性能提供任何帮助。无论如何,让我们把它说出来,正如问题中提到的 -
np.einsum('i,j->ij',np.arange(0, n, resolution), v) + p
关于python - 使用 np.einsum 进行光线转换的矢量化范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838342/