Xtensor を使いたい
色々あって、アウトプットをしていこうと思いました
現在、無職学生です バイトしたいです
Xtensorについては
を見ていただければわかると思います
C++ で書かれた行列計算ライブラリらしいです
みんな大好きAnacondaを使うことによって簡単にinstallすることができるらしいです
ついでに、このチーム(QuantStack)が開発しているらしい xeus-clingも導入していきたいと思います
Anaconda の導入
ここからファイルをダウンロードしてきます
ダウンロードディレクトリからファイルを移動させてきて
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ファイルを読み込む方法を追加しました