首页 > 解决方案 > 在 Drake 中,如何将 NumPy 数组转换为不同的标量类型?(例如从 float 到 AutoDiffXd 或 Expression?)

问题描述

在 Drake 中,我有 NumPyndarray的(一些多维的),dtype=float我想将它们转换为AutoDiffXd,Expression等。

在 C++ 中,我知道我可以做这样的事情:

MatrixXd X(2, 2);
X <<
   1.0, 2.0,
   3.0, 4.0;
MatrixX<AutoDiffXd> X_ad = X.cast<AutoDiffXd>();

然而,在 Python 中,我发现自己编写了这样的循环:

import numpy as np

from pydrake.autodiffutils import AutoDiffXd

X = np.array([
    [1.0, 2.0],
    [3.0, 4.0],
])

X_ad = np.zeros(X.shape, dtype=object)
for i in X.shape[0]:
    for j in X.shape[1]:
        X_ad[i, j] = AutoDiffXd(X[i, j])

有一个更好的方法吗?

标签: pythonnumpydrake

解决方案


您可以使用np.vectorize来缩短和概括您的代码:
https ://numpy.org/doc/1.13/reference/generated/numpy.vectorize.html

例如:

to_autodiff = np.vectorize(AutoDiffXd)
X_ad = to_autodiff(X)

如果您需要更复杂的逻辑,您可以随时自定义您的函数并使用装饰器:

@np.vectorize
def maybe_to_autodiff(x):
    if isinstance(x, float):
        return AutoDiffXd(x)
    else:
        return x

X_ad = maybe_to_autodiff(X)

这是对 Eigen 方法的(更灵活)模拟.cast<T>()(参见“基本矩阵操作”,包含“分配/复制”的行):
https ://eigen.tuxfamily.org/dox/group__QuickRefPage.html


推荐阅读