numpy与Eigen相互转换

  • Post author:
  • Post category:其他




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读入方法读进来。


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



版权声明:本文为weixin_44044411原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。