コンテンツにスキップ

Julia

インストール

エラー報告時のお役立ち: versioninfo()

1
julia> versioninfo()

あとで整理

filter

1
2
3
a = Array(3:999)
flt3or5(x) = x % 3 == 0 || x % 5 == 0
sum(filter(flt3or5, a))

importとusing

サンプルコード

1
2
3
4
5
6
7
8
9
module MyModule

export x, y

x() = "x"
y() = "y"
p() = "p"

end

using MyModule

  • in-scope: All exported names (x and y), MyModule.x, MyModule.y, and MyModule.p
  • extensible: MyModule.x, MyModule.y, and MyModule.p

using MyModule: x, p

  • in-scope: x and p
  • extensible: (nothing)

import MyModule

  • in-scope: MyModule.x, MyModule.y, and MyModule.p
  • extensible: MyModule.x, MyModule.y, and MyModule.p

import MyModule.x, MyModule.p

  • in-scope: x and p
  • extensible: x and p

import MyModule: x, p

  • in-scope: x and p
  • extensible: x and p

ipynb化 Literateを使う

#-を入れると生成したipynbのセルを区切れる.

下記コードでipynbが生成できる.

1
2
3
using Literate
Literate.notebook("example.jl", "."; documenter=false, credit=false, execute=false) # コードセルの評価なし
Literate.notebook("example.jl", "."; documenter=false, credit=false, execute=true)  # コードセルの評価あり

Jupyter 画像の表示

  • URL
  • Using IJulia; IJulia.display()で表示できる
    • 保存はPlotssavefigでできる(はず)
  • 他にもまだあるはずなので随時追記
1
2
3
4
using Images
image = [RGB(rand(N0f8,3)...) for x in 1:200, y in 1:150]
using IJulia
IJulia.display(image)

Jupyter Infoのログを出力させない

1
2
import Logging
Logging.disable_logging(Logging.Info)

map

1
2
3
4
map(fn, array)

str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
map(x -> parse(BigInt, x), split(str, "\n"))

Plots アニメーション作成

  • URL
  • 次のようなプログラムを書けばよい
1
2
3
4
using Plots
@gif for t in 1:300
    t番目のフレームのグラフをプロットするコード
end
1
2
3
4
5
using Plots
anim = @animate for t in 1:300
    t番目のフレームのグラフをプロットするコード
end
gif(anim, "foo.gif"; fps=20)

黒木メモ ツリーのメモ: リーマン予想の簡単な数値的検証

黒木メモ Juliaでのobject.method()スタイルの欠点

Note

以下のツリーをきちんと追いかける.

黒木メモ PyCall, Juliaから使うPythonの指定・設定

改めて試したとき (私の環境でインストールした) Juliaが独自にインストールしたCondaを使ってしまっていた. 別途インストールしている自分のPythonと合わせたいので, Juliaが使うPythonのパスを指定した.

1
2
3
julia> ENV["PYTHON"] = "任意のpython.exeのフルパス(python.exeを含む)"
julia> ]
pkg> build PyCall

元に戻すのは次の通り.

1
2
3
julia> ENV["PYTHON"] = ""
julia> ]
pkg> build PyCall

黒木メモ リスト内包表記

このツリーのメモ. 適当に編集して見やすくする.

例えば [f(x) for x in X] はリスト内包表記ではないし(リストではなくVectorができる)、多くの場合に[ ]で囲まない (f(x) for x in X) の方がよい(遅延評価されるGeneratorができる)。

sum([f(x) for x in X])と書くのは、 [ ] で囲んでいるせいでVector=1次元配列が作られ、その分だけメモリアロケーションが発生するので非常に損である。[ ] で囲むのをやめてsum(f(x) for x in X)とした方がよい。さらにsum(f, X)がシンプル!

1
2
3
4
5
Y = []
for x in X
    push!(Y, sinpi(x))
end
Y

のようなコードを書くのもひどく損である。 YがAny型成分のVectorになり、大幅な速度的劣化を招く。 Y = sinpi.(X)の方がよい.

ただし、公式ドキュメントのPerformance Tipsには目を通して、したがっておいた方が無難。

問題の設定を変えたければ、グローバル変数に値を代入している行を書き変える。それを何度でも繰り返す。 手抜きのコードを気楽に書いてもよいことにするべきだと私は強く思っているのですが、わざわざ、高等教育でそういう効率の悪すぎるワークフローを教えるのはひどい。 シンプルで分かりやすい処方箋は ①問題を記述するパラメータ群は1つの変数probにまとめる。 ②問題を記述するパラメータ群が梱包された変数probをその問題を解くために使用される函数に常に引数として渡す。 ③問題を解く函数をsol = solve(prob)のように使えるようにしておく。 問題を記述するパラメータ群をまとめるためにstructを使ってもよいし、もっと気楽にTupleやNamedTupleを使ってもよい。 例えば、単振り子の問題を記述するパラメータ群をNamedTupleにprob = (g = 9.80665, l = 2.0)とまとめたりする。

入門直後のプログラミング言語だと、そもそもコードがどのように構文解釈されるかがよくわからない。 JuliaではREPLなどで、どのようにパースされるかを確認したいコードを :( ) で囲んだ結果を見ればよいです。 函数の仕様は多くの場合に ?函数名 で確認できる。doc stringは大事。

入門直後のプログラミング言語は何をやっているかイメージがつかめなくて苦労する。 Juliaではシンプルな函数を書いて次のように書くと色々分かります。

1
2
3
4
@code_warntype f(1.2)
@code_typed f(1.2)
@code_llvm f(1.2)
@code_native f(1.2)

黒木メモ パイプ

標準のパイプだと書けない描き方もマクロ版がある. 例えばChain.

マクロなしでも次のような描き方はできる.

1
2
3
(1, 2, 3) |>
(((a, b, c),) -> a + b + c) |>
println
1
2
3
(1, 2, 3) |>
((a, b, c),) -> a + b + c |>
println
1
2
3
f((a, b, c)) = a + b + c
t = (1, 2, 3)
f(t)

数値

mod

1
2
10 % 2
1001 % 100

結果として巨大な数になるときの累乗

1
BigInt(2)^1000

文字列に変換

1
2
i = 100
string(i)

パッケージ関係

アンインストール: gc --all

  • allオプションを付けると使用されていない期間にかかわらず.julia/environmentsProject.tomlに記載されていない全てのパッケージと関連するア=ティファクトが削除される
1
pkg> gc --all

インストールされているパッケージを表示

1
using Pkg;Pkg.installed()

指定したバージョンのパッケージをインストールする

1
using Pkg; Pkg.add(PackageSpec(name="JuMP", version="0.18"))

指定したパッケージをインストール

1
using Pkg;Pkg.add("JuMP")

指定したパッケージを削除

1
using Pkg; Pkg.rm("JuMP")

すべてのパッケージをアップデート

1
using Pkg; Pkg.update()

文字列のパース・変換

1
2
3
4
5
parse(BigInt, x)
parse(Int, x)
parse(Int64, x)
parse(Float, x)
parse(Float64, x)

乱数のシード固定

  • URL
  • myseed=1234; Random.seed!(myseed=1234)を各セルで実行する必要がある模様
  • 各関数にseed=myseedでデフォルト引数を設定しておくと便利