Rとjuliaとrubyとpython
Rとjuliaとrubyとpython
ファイル
4つの言語の比較の第七弾として,ファイルの取り扱い方についてまとめてみた.まさか七弾まで来るとは,始めた当初は予想しなかった.基本的な使い方を比較して行く内に,これについてもまとめないとと,増えて行った.さて,肝心の表はこんな感じです.
| R | julia | ruby | python3 | |
| 読み込み | f<-file("index.html","r") d<-readLines(f) close(f) | f=open("index.html","r") d=readlines(f) close(f) | f=open("index.html","r") d=f.readlines f.close | f=open("index.html","r") d=f.readlines() f.close() |
| ブロック | d=open("index.html","r") do f readlines(f) end | d=open("index.html","r"){|f|f.readlines} | with open("index.html","r") as f: d=f.readlines() | |
| ファイル名 | d<-readLines("index.html") | d=readlines("index.html") | ||
| 全体読み込み | d<-readChar("index.html",file.info("index.html")$size,TRUE) | d=open(f->read(f,String),"index.html") | d=open("index.html","r"){|f|f.read} | with open("index.html","r") as f: d=f.read() |
| 書き込み | cat("Hello, world!",file="out.txt") | open(f->print(f,"Hello, world!"),"out.txt","w") | open("out.txt","w"){|f|f.print "Hello, world!"} | with open("out.txt","w") as f: f.write("Hello, world!") |
| 追加 | cat("Hello, world!",file="out.txt",append=TRUE) | open(f->print(f,"Hello, world!"),"out.txt","a") | open("out.txt","a"){|f|f.print "Hello, world!"} | with open("out.txt","a") as f: f.write("Hello, world!") |
Rとjuliaとrubyとpython
Rとjuliaとrubyとpython
Rとjuliaとrubyとpython
Rとjuliaとrubyとpython
Rとjuliaとrubyとpython
Rとjuliaとrubyとpython
数値の取り扱い
juliaを少しいじり始めたのだが,複数の言語の文法を混同して分からなくなってしまうので,並べて比較してみることにした.まずは,数値や数学関係の取り扱い方を,4つの言語について表にしてみた.
| R | julia | ruby | python3 | |
| 余 | 5%%2 | 5.0%2.0 | 5.0%2.0 | 5.0%2.0 |
| 商 | 5%/%2 | 5.0÷2.0 | 5/2 or 5.0.div(2.0) | 5.0//2.0 |
| 分数 | 5//2 | 5r/2 | from fractions import Fraction;Fraction(5,2) | |
| xor | bitwXor(3, 5) | 3⊻5 | 3^5 | 3^5 |
| 累乗 | 2^0.5 | 2^0.5 | 2**0.5 | 2**0.5 |
| 平方根 | sqrt(2) | √2 | Math.sqrt(2) | import math;math.sqrt(2) |
| 複素数 | (1+2i)^0.5 | (1+2im)^0.5 | (1+2i)**0.5 | (1+2j)**0.5 |
| 複素数 | sqrt(1+2i) | √(1+2im) | Math.sqrt(1+2i) | import numpy;numpy.sqrt(1+2j) |
| 実部 | Re(1+2i) | real(1+2im) | (1+2i).real | (1+2j).real |
| 虚部 | Im(1+2i) | imag(1+2im) | (1+2i).imag | (1+2j).imag |
| 共役 | Conj(1+2i) | conj(1+2im) | (1+2i).conj | (1+2j).conjugate() |
| 偏角 | Arg(1+2i) | angle(1+2im) | (1+2i).arg | import cmath;cmath.phase(1+2j) |
| 絶対値 | abs(-1) | abs(-1) | -1.abs | abs(-1) |
| 円周率 | pi | π | Math::PI | import math;math.pi |
| Euler数 | exp(1) | ℯ | Math::E | import math;math.e |
行列の計算の言語による違い
Rとjuliaとpythonとruby
プログラム言語で数値計算をしようとするときに,行列を扱う必要がある場合がある.そのやり方が言語毎に特徴があるので,比較してみた.例として,行列を定義して,固有値を固有ベクトルを求めて,対角化を計算する場合について,やり方を見てみよう.
まず,私が数値計算をするときによく使っているRでは,インストールするだけで,行列を使うことができる.逆行列を求めるコマンドがsolveである点と,行列の掛け算が%*%であることに注意すれば,簡単に使うことができる.
a<-t(matrix(1:4,2,2)) r<-eigen(a) r$values r$vectors solve(r$vectors)%*%a%*%r$vectors
次に,近年人気が出てきたjuliaであるが,これもインストールした時点で行列自体は使えて,さらにLinearAlgebraを組み込むことによって,固有値などの計算をすることができる.
a=[1 2; 3 4] using LinearAlgebra r=eigen(a) r.values r.vectors inv(r.vectors)*a*r.vectors
数値計算の分野でもシェアを広げているpythonでは,numpyを使う必要がある.pipなどでこれをインストールできる.私の場合は,debianでaptitudeからpython3-numpyを入れた.numpyをimportして,linalgを使うと計算ができる.行列の掛け算がnp.dot()で書かないといけないのが面倒だったのだが,新しいversionでは@を使えるようになったようだ.
import numpy as np a=np.array([[1,2],[3,4]]) r=np.linalg.eig(a) r[0] r[1] #np.dot(np.dot(np.linalg.inv(r[1]),a),r[1]) np.linalg.inv(r[1])@a@r[1]
最後にrubyであるが,数値計算は比較的苦手である.行列計算はnarrayを使えば良いのだが,固有値の計算などは困難である.そこで,numo-linalgというものを使ってみた.このインストールは少し手間取ったが,以下のようにしたらdebianにインストールすることができた.
sudo apt install liblapacke libopenblas0 sudo apt install git ruby gcc ruby-dev rake make sudo gem install specific_install sudo gem specific_install https://github.com/ruby-numo/numo-narray.git sudo gem install numo-linalg -- --with-backend=openblas --with-openblas-lib=/usr/lib/x86_64-linux-gnu
すると,numo/linalgをrequireしたら計算できるのだが,いちいちNumoと書くのが面倒なので,それをincludeした.narrayの場合には,NMatrixを定義すると,行列の積は*で書けるのだが,numoの場合には,numo-narrayのdotを使って書かないといけないのが面倒に感じた.
require "numo/linalg" include Numo a=NArray[[1,2],[3,4]] r=Linalg.eig(a) r[0] r[2] Linalg.inv(r[2]).dot(a).dot(r[2])
これらの4つの言語について,インストールのしやすさと,使いやすさを主観でまとめると,下の表のようになった.Rとjuliaはそれなりに使いやすいかな.pythonは行列の積が書きやすくなったことにより,昔よりは書きやすくなった.rubyはインストールが面倒だし,methodをうまく定義して,もっと使いやすくできるポテンシャルを秘めているが,まだまだのように感じる.ニーズが無いのかな.
| install | use | |
|---|---|---|
| R | ◎ | ◎ |
| julia | ◎ | ◎ |
| python | ○ | △→○ |
| ruby | △ | ○ |
数値計算をする場合には,Rを中心にやっていくことになりそうだ.juliaも使うようにすると,Rが苦手な処理を書きやすくなるかも知れない.