我有一个3x1点矢量表示某条线的起点,3x1点矢量表示某条线的终点。我想在这两点连接的线上采样任意数量的点。
np.linspace正是我所需要的,但在一维中。是否有类似的功能可以扩展到3维?
由于
答案 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