投稿

6月, 2018の投稿を表示しています

julia で、n×m の Array で平均等の計算の速度を上げる方法

先日、 juliaDB は、早いという話しを書きました 。しかしながら、Array を、しっかりと使いこなすと、Array はとても早いです。 先日の DataFrame を作ってみましょう。 julia> df = DataFrame( col1 = randn(10^5), col2 = randn(10^5), col3 = randn(10^5) ); この DataFrame の横方向の合計等を調べようというお話しです。 単純に、横方向の合計を求める場合は、まず、Array に変換して、sum(A::Array,2) とするだけで良いようです。 julia 1.0 の人は、sum(A::Array, dims=2) なので注意です。 julia> A = Array(df); julia> sum(A,2) # julia 1.0 のひとは、"sum(A, dims=2)" です 100000×1 Array{Float64,2}: 0.339824 -0.711329 5.8185 -1.94555 0.535156 -0.670403 -1.56872 0.534236 -1.98732 -2.90369 ⋮ 略 これで1撃です。mean(), std()なども、この方法が使えます。 では、先日の関数、 julia> function summary_row(df::DataFrame) array_selected = Array(df[collect(df[:,2].>0) .& collect(df[:,2].>0),:]) row_sum=Array{Float64,1}[] row_mean=Array{Float64,1}[] for i in 1:size(array_selected)[1] if i==1 row_sum = sum(array_selected[i,:]) ...

Gaston.jl 静かに復活

julia に、gnuplot のインターフェイスを提供する Gaston.jl が静かに復活していたようです。julia 0.6.3 で、しっかりと動きます。ただし、MacOS X でご使用の場合は、注意点があります。 julia> Pkg.add("Gaston") INFO: Cloning cache of Gaston from https://github.com/mbaz/Gaston.jl.git INFO: Installing Gaston v0.7.4 INFO: Package database updated julia> using Gaston julia> t = 0:0.01:1 0.0:0.01:1.0 julia> plot(t, sin.(2π*5*t)) WARNING: Gnuplot returned an error message: WARNING: Plotting with an 'unknown' terminal. No output will be generated. Please select a terminal with 'set terminal'. 1 set terminal をしないといけないようです。これは、下記のように記載します。 julia> set(terminal="aqua") または julia> set(terminal="aqua") あとは、チュートリアルを見ていただく方が良いでしょう。 https://nbviewer.jupyter.org/github/mbaz/Gaston.jl/blob/master/doc/gaston-tutorial.ipynb

julia の using PyCall が動かなくなった

Homebrew などで、管理している Python を julia から呼び出してる場合、Homebrew などで Python をアップデートした直後に、PyCall が動かなくなります。 Fatal Python error: Py_Initialize: unable to load the file system codec ModuleNotFoundError: No module named 'encodings' .... みたいなエラーがでます。こんな時は、 julia> Pkg.build("PyCall") を試してみましょう。

seaborn 0.8.0 でのカラーマップの変更点について

seaborn 0.8.0 から4つの新しいカラーマップが追加になったようです。 two sequential colormaps (連続変数用) “rocket” “mako” two diverging colormaps (真ん中が 0 になるような変数用) “icefire” “vlag” heatmap() のデフォルトが、"rocket", "icefire"に変更されました。matplot のデフォルトは、"viridis" だそうです。真ん中が 0 になるような変数用を使いたい場合は、center を指定しないといけないそうです。 seaborn 0.7.x の真ん中が 0 になるような変数用の色は、たぶん、"vlag" で良いのだろと考えます。紙印刷の時は "vlag" は、やわらかくて良いですね。 Colormaps in Matplotlib の下の方に帯の表示があります。この名前が基本的には使えます。 おまけで、カラーマップの一覧を記載します。 Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Se...

pip でインストールした python パッケージのアップデート

pip でインストールした python パッケージのアップデートをしていなかったら、すっかり、パッケージが古くなってしまいました。 アップデートしようと思ったら、意外に難しい。julia だったら Pkg.update() で一発なのに... まずは、pip 自身をアップデートします。なお、以下のコマンドはターミナルに書きます。少し古い pip3 環境をひきずっている人は、はじめの pip が pip3 になりますので、注意して下さい。brew をアップデートしていても pip で入れたものは、置いてきぼりで、pip 自身すらアップデートされないようです。 $ pip install -U pip 続いては、pip で管理しているパッケージを表示してみます。 $ pip list 新しいパッケージがあれば、表示してもらう場合は、--o を付けます。 $ pip list --o これで、更新版のあるパッケージが判ります。そして、 $ pip install -U %更新したいパッケージ pip install -U に続けて、希望のパッケージを入力してアップデートです。 一括更新その1、pip-review を使う ひとつずつ、インストールするのが面倒な場合は、pip-review を導入しましょう。 $ pip install pip-review 残念ながら、pip-review は、pip-review 自身をアップデートできないようです。すでに導入ずみの人は、先にアップデートしましょう。-U の位置は下記でないと動かないことがあります。 $ pip install -U pip-review 改めて、 $ pip-review --auto 注意は、requirement でエラーが出ることがあることです。エラーが出た場合は、ひとつずつ pip install し直すことをお奨めします。pip-review は依存関係に関係なく最新版を入れてしまうことがありますので、注意が必要です。 一括更新その2、シェルコマンドでがんばる MacOS X を含む Unix 系は、下記でいけるようです。@mokusen さんの pipでパッケージを一括アップデートする(window...

静かに深化している julia の DataFames の describe()

イメージ
R の summary() に比べると、いまひとつだった、julia の DataFrames の describe() という印象でした。しかし、静かに深化しています。 では、毎度、おなじみの iris を呼び出しましょう。 julia> using RDatasets julia> iris = dataset("datasets", "iris"); では、describe() を使ってみましょう。 julia> @time describe(iris) 0.000637 seconds (450 allocations: 24.531 KiB) 5×7 DataFrames.DataFrame │ Row │ variable │ mean │ min │ median │ max │ nmissing │ eltype │ ├─────┼─────────────┼─────────┼─────────┼─────────┼─────────┼──────────┼────────────────────────────────────────────┤ │ 1 │ SepalLength │ 5.84333 │ 4.3 │ 5.8 │ 7.9 │ nothing │ Float64 │ │ 2 │ SepalWidth │ 3.05733 │ 2.0 │ 3.0 │ 4.4 │ nothing │ Float64 │ │ 3 │ PetalLength │ 3.758 │ 1.0 │ 4.35 │ 6.9 │ nothing │ Float64 │ │ 4 │ PetalWidth │ 1.19933 │ 0.1 │ 1.3 │ 2.5 │ no...

Array でしていた計算を、JuliaDB の table ですると早くなる例その2

Array でしていた計算を、JuliaDB の table ですると早くなる例その2です。 ユークリッド距離の2乗の距離行列を求めてみましょう。データの例は、かって知りたる iris です。 iris を読み込んで、Array と table (正確には、IndexedTables.NextTable) に変換します。 using RDatasets, DataFrames, JuliaDB iris = dataset("datasets", "iris") A = Array(iris[:,1:4]) table_iris = table(iris[:,1:4]) table への変換は、Array からの変換は結構、面倒で、DataFrame を1回通す方が楽です。ただし、この場合、DataFrames と JuliaDB が一緒に動くので、後から立ち上げた方の stack, aggregate、 groupby などが使えなくなることがあります。 では、おたがいの距離行列の計算式を関数化します。 # JuliaDB function tb_dist(indexed_table::IndexedTables.NextTable) dist_mat = [sum((rows(indexed_table)[i] .- rows(indexed_table)[1]).^2) for i in 1:length(indexed_table)] for j in 2:length(indexed_table) dist_mat = hcat( dist_mat, [sum((rows(indexed_table)[i] .- rows(indexed_table)[j]).^2) for i in 1:length(indexed_table)] ) end return dist_mat end #Array function Array_dist(A::Array) dist_mat = [ sum((A[i,:] .- A[1,:]).^2) for i in 1:si...

julia の行列入れ替え (転置行列); transpose() と permutedims()

julia で 2次元行列を入れ替えて、転置行列を求める方法は2つあるようです。transpose() と permutedims() です。 permutedims() は、多次元配列でも使えるようですので、汎用性は高いようです。 下記に例を記載します。 数字のみの2次元行列 julia> test_array = [1 3 ; 2 4 ; 3 6 ] 3×2 Array{Int64,2}: 1 3 2 4 3 6 julia> transpose(test_array) 2×3 Array{Int64,2}: 1 2 3 3 4 6 julia> permutedims(test_array, [2,1]) 2×3 Array{Int64,2}: 1 2 3 3 4 6 julia> permutedims(test_array, [2,1]) == transpose(test_array) true どちらも結果は一緒です。 文字列を含む2次元行列 文字列が入ると、transpose() はエラーが出ます。 julia> test_array2 = [1 3 ; 2 4 ; 3 6 ; "sakura" "neko" ] 4×2 Matrix{Any}: 1 3 2 4 3 6 "sakura" "neko" julia> permutedims(test_array2, [2,1]) 2×4 Matrix{Any}: 1 2 3 "sakura" 3 4 6 "neko" julia> transpose(test_array2) 2×4 transpose(::Matrix{Any}) with eltype Any: Error showing value of type LinearAlgebra.Transpose{Any, Matrix{Any}}: ERROR: MethodError: no method matc...

爆速の JuliaDB

2018年11月現在で、JuliaDB は julia 1.0.x では動きません。下記は、julia 0.6.x を使っていますので、注意して下さい。 JuliaDB について JuliaDB のドキュメントのはじめには、 "JuliaDBは、Juliaのフルパワーで、あらゆる大きさのデータを扱うため多彩なデータ構造を提供します。" と記載されています。 めざした点は4つ 多次元データセットを迅速に段階的に読み込む データにインデックスを付けて、フィルター、集約、ソート、および結合操作を行う 結果を記録し、後に効率的に読み込む Juliaの組み込み並列処理を簡単に使用して、マシンまたはクラスタを完全に活用する と述べられています。 前回のブログで、JuliaDB に少しだけ触りました。もう少し、触ってみましょう。 自分の使用方法だと、速度が最大の関心事です。 DataFrame で、row 毎の平均を求めてみよう 10000×3 の大きさの DataFrame を作ります。1列目と2列目が正の行を選び、行の平均を求めます。@time は、関数にしないと測れないので、関数を定義して測定します。2018年5月末に julia 0.63 が出たので、0.63 で測定してみます。 julia> df = DataFrame( col1 = randn(10^5), col2 = randn(10^5), col3 = randn(10^5) ); julia> function summary_row(df::DataFrame) array_selected = Array(df[collect(df[:,2].>0) .& collect(df[:,2].>0),:]) row_sum=Array{Float64,1}[] row_mean=Array{Float64,1}[] for i in 1:size(array_selected)[1] ...