python - 使用 np.einsum 进行光线转换的矢量化范围

标签 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

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

相关文章:

python - 我将如何实现返回可重现结果的类似 random.choice() 的函数?

python - 使用Python多行解析Xml

python - 无法在 numpy.datetime64 上调用 strftime,没有定义

python - 体系结构如何影响 numpy 数组操作性能?

python - conda 在 windows 64 上安装 matplotlib 的 natgrid python 工具包

python - Django:ModelForms:ImageField 始终为空并被 ModelForm 拒绝

python - 关于 numpy.int32 与 int 的 Python 处理问题

python - 两个数组之间的余弦距离计算 - Python

python - 我如何做一个模仿 'keepdims' 的 einsum?

python - 使用 Numpy 进行外减法