是否有像3D线条的np.linspace?

时间:2018-03-15 18:22:27

标签: numpy numpy-broadcasting numpy-ndarray

我有一个3x1点矢量表示某条线的起点,3x1点矢量表示某条线的终点。我想在这两点连接的线上采样任意数量的点。

np.linspace正是我所需要的,但在一维中。是否有类似的功能可以扩展到3维?

由于

1 个答案:

答案 0 :(得分:1)

我的插值建议:

ticks

相当于3个linspace调用

In [664]: p1=np.array([0,1,2])
In [665]: p2=np.array([10,9,8])
In [666]: l1 = np.linspace(0,1,11)
In [667]: l1
Out[667]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
In [668]: p1+(p2-p1)*l1[:,None]
Out[668]: 
array([[ 0. ,  1. ,  2. ],
       [ 1. ,  1.8,  2.6],
       [ 2. ,  2.6,  3.2],
       [ 3. ,  3.4,  3.8],
       [ 4. ,  4.2,  4.4],
       [ 5. ,  5. ,  5. ],
       [ 6. ,  5.8,  5.6],
       [ 7. ,  6.6,  6.2],
       [ 8. ,  7.4,  6.8],
       [ 9. ,  8.2,  7.4],
       [10. ,  9. ,  8. ]])

对此的变化是:

In [671]: np.stack([np.linspace(i,j,11) for i,j in zip(p1,p2)],axis=1)
Out[671]: 
array([[ 0. ,  1. ,  2. ],
       [ 1. ,  1.8,  2.6],
       [ 2. ,  2.6,  3.2],
       [ 3. ,  3.4,  3.8],
       [ 4. ,  4.2,  4.4],
       [ 5. ,  5. ,  5. ],
       [ 6. ,  5.8,  5.6],
       [ 7. ,  6.6,  6.2],
       [ 8. ,  7.4,  6.8],
       [ 9. ,  8.2,  7.4],
       [10. ,  9. ,  8. ]])

真的是相同的计算,只是语法不同。

可以改为使用

np.c_[tuple(slice(i,j,11j) for i,j in zip(p1,p2))]

outer

但即便如此也使用广播。 p1+np.outer(l1,(p2-p1)) 为(3,),p1为(11,3),结果为(11,3)。

@ Brad的方法以不同的方式处理端点

outer