1

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

我想在连续将向量 v*resolution 添加到点 pn/分辨率时间后获得所有点。

例子

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 的直接方法?

4

1 回答 1

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
于 2017-06-30T04:04:41.493 回答