Numpy使いのためのEigenチートシート

Eigen

v3.4からスライスが便利になるそうだが、最新Stable版の利用を前提にする。

時期が来たらこっそりエントリー書き換えるかも。

git clone https://gitlab.com/libeigen/eigen.git
git checkout tags/3.3.7

導入

#include <Eigen/Core>
using namespace Eigen;

基本

ベクトル - 1D Array - Vector

  • numpyのデフォルトはfloat64(=double)らしいので、それに倣う。
  Numpy Eigen
配列確保 a = np.empty(size) VectorXd a(size);
ゼロベクトル a = np.zeros(size) VectorXd a = VectorXd::Zero(size);
1ベクトル a = np.ones(size) VectorXd a = VectorXd::Ones(size);
fill a.fill(1) a.fill(1);
ベクトル長 a.shape[0] a.size();
要素アクセス a[0]
a[-1]
a(0)
a(a.size()-1)
スライス・アクセス a[a:a+n]
a[:n]
a[-n:]
a.segment(a,n)
a.head(n)
a.tail(n)
要素べき乗 a**n
a**2
a.array().pow(n)
a.array().square()
要素ルート a**0.5 a.array().sqrt()
要素総和 np.sum(a) a.sum()

行列 - 2D Array - Matrix

  Numpy Eigen
配列確保 a = np.empty((r,c)) MatrixXd a(r,c);
ゼロ行列 a = np.zeros((r,c)) MatrixXd a = MatrixXd::Zero(r,c);
1s 行列 a = np.ones((r,c)) MatrixXd a = MatrixXd::Ones(r,c);
サイズ a.shape a.rows(), a.cols()
要素アクセス a[r,c] a(r,c)
スライス・アクセス a[r:r+n,c:c+m] a.block<n,m>(r,c)
a.block(r,c,n,m)
列アクセス a[r] a.row(r)
行アクセス a[:,c] a.col(c)
flatten#1 a.flatten('F') Map<const VectorXd>(a.data(), a.size())
flatten#2 a.flatten() MatrixXd b = a.transpose();
Map<const VectorXd>(b.transpose().data(), b.size());
reshape
- MatrixXdのみ
a.reshape((r,c)) a.resize(r,c)
// 非破壊でreshapeするなら a.reshaped(r,c)
reshape a.reshape((r,c)) MatrixXd x = Map<Matrix<double, r, c>>(a.data());
transepose a.T a.transpose()
逆行列 np.linalg.inv(a) a.inverse()

配列構築・スニペット系

Eigenにはないnumpy/scipyの便利関数たち

  Numpy Eigen
vstack np.vstack([a, b])
MatrixXd c(a.rows()+b.rows(), a.cols());
c << a, b;
hstack np.hstack([a, b])
MatrixXd c(a.rows(), a.cols()+b.cols());
c << a, b;
対角行列 np.diag([0, 1, 2, 3])
MatrixXd v(4,1);
v << 0.,1.,2.,3;
MatrixXd m = v.asDiagonal();
block Diag # Scipy # numpycpp参照

参考

No comments:

Post a Comment