【问题标题】:Numpy matrix combinationNumpy矩阵组合
【发布时间】:2016-02-02 12:19:20
【问题描述】:

我有一个旋转矩阵和平移向量作为对应的 numpy 对象。将它们组合成 4x4 变换矩阵的最佳方法是什么?是否有任何功能可以避免虚拟元素复制?

【问题讨论】:

  • 不用担心数组这么小的副本。
  • 当然,无论如何都需要复制,但我想知道是否可以使用一些 numpy api 使其更准确。

标签: python numpy rotation translation


【解决方案1】:

有很多方法可以做到这一点;这里有两个。

您可以创建一个空的 4x4 数组。然后可以将旋转矩阵和平移向量分别复制到具有切片分配的 4x4 变换矩阵中。比如Rt分别是旋转矩阵和平移向量。

In [23]: R
Out[23]: 
array([[ 0.51456517, -0.25333656,  0.81917231],
       [ 0.16196059,  0.96687621,  0.19727939],
       [-0.8420163 ,  0.03116053,  0.53855136]])

In [24]: t
Out[24]: array([ 1. ,  2. ,  0.5])

创建一个空的 4x4 数组 M,并用 Rt 填充它。

In [25]: M = np.empty((4, 4))

In [26]: M[:3, :3] = R

In [27]: M[:3, 3] = t

In [28]: M[3, :] = [0, 0, 0, 1]

In [29]: M
Out[29]: 
array([[ 0.51456517, -0.25333656,  0.81917231,  1.        ],
       [ 0.16196059,  0.96687621,  0.19727939,  2.        ],
       [-0.8420163 ,  0.03116053,  0.53855136,  0.5       ],
       [ 0.        ,  0.        ,  0.        ,  1.        ]])

或者你可以用numpy.hstacknumpy.vstack等函数组装变换矩阵:

In [30]: M = np.vstack((np.hstack((R, t[:, None])), [0, 0, 0 ,1]))

In [31]: M
Out[31]: 
array([[ 0.51456517, -0.25333656,  0.81917231,  1.        ],
       [ 0.16196059,  0.96687621,  0.19727939,  2.        ],
       [-0.8420163 ,  0.03116053,  0.53855136,  0.5       ],
       [ 0.        ,  0.        ,  0.        ,  1.        ]])

请注意,t[:, None](也可以拼写为t[:, np.newaxis]t.reshape(-1, 1))创建t 的二维视图,形状为(3, 1)。这使得该形状在对np.hstack 的调用中与M 兼容。

In [55]: t[:, None]
Out[55]: 
array([[ 1. ],
       [ 2. ],
       [ 0.5]])

【讨论】:

    猜你喜欢
    • 2017-06-22
    • 2010-12-28
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2012-08-15
    • 2011-03-21
    相关资源
    最近更新 更多