如何解决在 Drake 中,如何将 NumPy 数组转换为不同的标量类型? 例如从 float 到 AutoDiffXd 或 Expression?
在 Drake 中,我有 ndarray
的 NumPy 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])
有没有更好的方法来做到这一点?
解决方法
您可以使用 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。