【问题标题】:Is there something like np.linspace for 3D lines?3D 线是否有类似 np.linspace 的东西?
【发布时间】:2018-08-24 16:34:21
【问题描述】:

我有一个代表某条线起点的 3x1 点向量和一个代表某条线终点的 3x1 点向量。我想沿着由这两个点连接的线对任意数量的点进行采样。

np.linspace 完全符合我的需要,但在一维中。有没有类似的功能可以扩展到3维?

谢谢

【问题讨论】:

  • 如何使用线性函数将 1d 数组映射到 3d 空间 - 线性插值?
  • 您可以使用np.interpnp.repeat + np.cumsumnp.repeat((b - a) / 10, [10, 10, 10]).reshape(3, -1) 做一些事情,但这可能比itertools.starmap 做更多的工作。
  • np.append(a[:, None], np.repeat((b - a) / 10, [10, 10, 10]).reshape(3, -1).cumsum(axis=1), axis=1)
  • this 会回答您的问题吗?让我知道您是否可以结束您的问题。

标签: numpy array-broadcasting numpy-ndarray


【解决方案1】:

我的插值建议:

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. ]])

相当于 3 次 linspace 调用

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))

但即使这样也使用广播。 p1 是 (3,),outer 是 (11,3),结果是 (11,3)。


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

In [686]: np.append(p1[:, None], np.repeat((p2 - p1) / 10, [10, 10, 10]).reshape
     ...: (3, -1).cumsum(axis=1), axis=1)
Out[686]: 
array([[ 0. ,  1. ,  2. ,  3. ,  4. ,  5. ,  6. ,  7. ,  8. ,  9. , 10. ],
       [ 1. ,  0.8,  1.6,  2.4,  3.2,  4. ,  4.8,  5.6,  6.4,  7.2,  8. ],
       [ 2. ,  0.6,  1.2,  1.8,  2.4,  3. ,  3.6,  4.2,  4.8,  5.4,  6. ]])
In [687]: _.shape
Out[687]: (3, 11)

【讨论】:

  • 谢谢。 *l1[:,None] 在您的示例中做了什么?
  • 这是一个广播乘法,实际上是一个外积。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2016-10-17
  • 2016-08-02
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多