numpy与Eigen相互转换

10 篇文章 47 订阅

0. 引言

\qquad Numpy和Eigen分别是Python和C++常用的矩阵操作工具,本文旨在说明两个库保存的矩阵格式如何相互读入。本文先介绍二者对自身格式矩阵的读写,然后再介绍它们如何相互读取各自保存的矩阵。

1. Eigen矩阵的读写

1.1. Eigen矩阵写入

\qquad Eigen矩阵重载了"<<"运算符,因此可以直接通过<<一次性写入fstream文件流,一个简单的例子如下:

#include <fstream>

Eigen::Matrix4d mat = Eigen::Matrix4d::Identity();
std::string filename = "test.bin"; // 后缀不重要
std::ofstream outfile(filename, std::ios::ate | std::ios::binary); // std::ios::ate是写模式, std::ios::binary是二进制模式
outfile << mat;  // Eigen矩阵一次性写入文件
outfile.close();

1.2. Eigen矩阵读入

\qquad Eigen矩阵读入时不可以一次性读入。准确来说,Eigen矩阵保存时是按照double类型以二进制形式写入的,矩阵每个元素之间保留空格。因此读入时按照元素对矩阵进行赋值,赋值前需要知道矩阵维度。

#include <fstream>

Eigen::Matrix4d mat;
std::string filename = "test.bin"; // 后缀不重要
std::ifstream infile(filename, std::ios::binary);  // std::ios::binary是二进制模式
for(int i=0;i<4;++i){
    for(int j=0;j<4;++j){
        infile >> mat(i,j);  //先列后行赋值
    }
}
infile.close();

2. Numpy矩阵读写

2.1. Numpy矩阵读入

\qquad Numpy矩阵可以直接通过np.savez, np.save等函数矩阵读入,但是本文不是介绍这种,而是介绍与Eigen矩阵更加类似的二级制写入方式:

import numpy as np
import ctypes
a = np.eye(4).astype(ctypes.c_float64)  # double类型的numpy数组
a.tofile("test.bin",sep=" ")  # 二进制写入,空格作为分割符号

2.2. Numpy矩阵读入

\qquad Numpy可以通过fromfile将二进制文件读入为numpy矩阵:

import numpy as np
a = np.fromfile("test.bin",sep=" ").reshape(4,4)  # 需要知晓维度

3. 相互读写

\qquad 由于二进制文件的兼容性,1.1, 1.2, 2.1, 2.2节两两组合即完成了Eigen与Numpy的相互转化,即通过2.2写入的test.bin文件可通过1.1的Eigen方法读入,而1.2写入的Eigen矩阵也可通过2.1介绍的Numpy读入方法读进来。

希望本文对您有帮助,谢谢阅读

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非线性光学元件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值