python - 在 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])
有一个更好的方法吗?
解决方案
您可以使用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
推荐阅读
- python - 如何在if语句python中检查可变长度列表的元素
- c++ - 我用[]方法赋值,通过std::cout可以打印出数据,但是为什么size()返回0呢?
- c# - 如何设置特定进程窗口的参数?
- tsql - 如何在由 Stick 分隔的一行上显示相同特征名称的不同特征值?
- ios - 从 UIKit 切换到 SwiftUI 并将 API 数据传递到视图的问题
- html - Bootstrap 4 Navbar 防止项目折叠和居中
- php - 我如何解析从 API 调用返回的非常大的 json 响应
- mysql - 如何在 R 中使用 Sequel Pro 从 MySQL 中并行获取数据
- java - JpaRepository.save() 生成 hql 将空值插入表中
- vue.js - 如何将 toggleSelectAll 功能复选框添加到由标头插槽生成的新标头