oniwan111’s blog

学生が少しでも社会の役に立てればいいなと思って始めたブログです

Xtensor を使いたい

色々あって、アウトプットをしていこうと思いました

現在、無職学生です バイトしたいです

Xtensorについては

github.com

を見ていただければわかると思います

C++ で書かれた行列計算ライブラリらしいです

みんな大好きAnacondaを使うことによって簡単にinstallすることができるらしいです

ついでに、このチーム(QuantStack)が開発しているらしい xeus-clingも導入していきたいと思います

Anaconda の導入

www.anaconda.com

ここからファイルをダウンロードしてきます

ダウンロードディレクトリからファイルを移動させてきて

bash

bash Anaconda3-5.2.0-Linux-x86_64.sh

して面倒なので全部デフォルトでYesにしました

conda create -n cilng
source activate cling

したあとに

conda install xeus-cling notebook -c QuantStack -c conda-forge

でしばらく待ちます(僕の回線が遅いためかめっちゃ時間かかった...)

jupyter notebook

をすると、C++14のカーネルが追加されているのでそれを起動


#include<iostream>
std::cout << "Hamutarou" << std::endl;

Hamutarou

xtensorのinstall

とっても簡単ですね

conda install -c conda-forge xtensor

するだけです

そしてJupyter 上で

#include <iostream>
#include "xtensor/xarray.hpp"
#include "xtensor/xio.hpp"
#include "xtensor/xview.hpp"

xt::xarray<double> arr1
  {{1.0, 2.0, 3.0},
   {2.0, 5.0, 7.0},
   {2.0, 5.0, 7.0}};

xt::xarray<double> arr2
  {5.0, 6.0, 7.0};

xt::xarray<double> res = xt::view(arr1, 1) + arr2;

std::cout << res;
{  7.,  11.,  14.}

と出ました

Xframeをinstall

実は僕のメインはこのXframeを使うことです

適当に

git clone https://github.com/QuantStack/xframe.git

してcmakeしたら動きました

以下結果になります

#include <string>
#include <iostream>

#include "xtl/xbasic_fixed_string.hpp"

#include "xtensor/xio.hpp"

#include "xframe/xvariable.hpp"
#include "xframe/xvariable_view.hpp"
using fstring = xtl::xfixed_string<55>;

using data_type = xt::xoptional_assembly<xt::xarray<double>, xt::xarray<bool>>;
using coordinate_type = xf::xcoordinate<fstring, data_type::size_type>;

using variable_type = xf::xvariable<coordinate_type, data_type>;
// Creation of an axis with `int` labels, given the size
std::cout << xf::axis(15);
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, )
// `int` labels, given the start and stop
std::cout << xf::axis(5, 15);
(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, )
// `char` labels, given the start and stop
std::cout << xf::axis('d', 'r', char(2));
(d, f, h, j, l, n, p, )
data_type data1 = {{ 1., 2., 3.},
                  { 4., 5., 6.},
                  { 7., 8., 9.}};
data1(0, 2).has_value() = false;
data1(1, 0).has_value() = false;
auto var1 = variable_type(
    data1,
    {
        {"abscissa", xf::axis({'a', 'c', 'd'})},
        {"ordinate", xf::axis({1, 2, 4})}
    }
);
std::cout << var1.select({{"abscissa", 'a'}, {"ordinate", 1}});
1
std::cout << var1.locate('c', 2);
5
std::cout << var1;
{{  1,   2, N/A},
 {N/A,   5,   6},
 {  7,   8,   9}}
Coordinates:
abscissa: (a, c, d, )
ordinate: (1, 2, 4, )
auto var2 = variable_type(
    data1, 
    {
        {"abscissa", xf::axis({'a', 'c', 'e'})},
        {"ordinate", xf::axis({1, 3, 4})}
    }
);
variable_type res1 = var1 + var2;
std::cout << res1;
{{  2, N/A},
 {N/A,  12}}
Coordinates:
abscissa: (a, c, )
ordinate: (1, 4, )
std::cout << var2;
{{  1,   2, N/A},
 {N/A,   5,   6},
 {  7,   8,   9}}
Coordinates:
abscissa: (a, c, e, )
ordinate: (1, 3, 4, )

Pandasで逐次処理していくと何日間かかかってしまうので、C++でDataFrameないかなーとか考えてたらXframeにたどり着きました

このXframe、まだ開発途中みたいなのですが、僕が利用してユーザーの意見を届けようと思っています

次からは、XtensorやXframeをもう少し詳しく記事にしていこうかと思います

xtensorでcsvファイルを読み込む方法を追加しました

oniwan111.hatenablog.com