並べ替え
d = [3, 2, 5, 1, 4];
sort(d) # 1, 2, 3, 4, 5; 昇順ソート
sort(d, rev=true) # 5, 4, 3, 2, 1; 降順ソート
値のある場所のインデックス
一番大きい要素のインデックス,二番目に大きい要素のインデックス,...
sortperm(d) # 4, 2, 5, 3, 1; 昇順ソートするときに,順に取り出す要素の位置
d[sortperm(d)] # sortperm(d) を使ってソートするのはこういうこと
sortperm(d, rev=true) # 3, 5, 1, 2, 4; 降順ソートするときに,順に取り出す要素の位置
d[sortperm(d, rev=true)] # 5, 4, 3, 2, 1; sortperm(d) を使ってソートするのはこういうこと
sort!(d) # 1, 2, 3, 4, 5; 破壊的ソート。d がインプレースでソートされるので,代入しなくてよい。
d # 1, 2, 3, 4, 5; 内容が変わっている
統計関数
using Statistics
using Random;
Random.seed!(12345); # 乱数の種
x = randn(100);
最大値
maximum(x) # 2.1307390315181536; 最大値
argmax(x) # 55; 最大値のあるインデックス
findmax(x) # (2.1307390315181536, 55)); 最大値とそのインデックス
最小値
minimum(x) # -2.3280152457586003; 最小値
argmin(x) # 73; 最小値のあるインデックス
findmin(x) # (-2.3280152457586003, 73); 最小値とそのインデックス
最大値と最小値
maximu(), minimu() 両方やるよりも遅い。
extrema(x) # (-2.3280152457586003, 2.1307390315181536);
和
sum(x) # 0.9821131440360702
平均値
mean(x) # 0.009821131440360701
不偏分散,分散
var(x) # 0.9954011110241598
var(x, corrected=false) # 0.9854470999139182
不偏標準編纂,標準偏差
std(x) # 0.9976979056929807
std(x, corrected=false) # 0.9926968821921011
中央値
median(x) # 0.13578110308214625
median!(x) # 0.13578110308214625; 破壊的(インプレース)関数
要約統計量
describe(x)
# Summary Stats:
# Length: 100
# Missing Count: 0
# Mean: 0.009821
# Minimum: -2.328015
# 1st Quartile: -0.684464
# Median: 0.135781
# 3rd Quartile: 0.690881
# Maximum: 2.130739
# Type: Float64
y = [2, 4, 1, 3, 5];
差
diff(y) # 2, -3, 2, 2
累和
cumsum(y) # 2, 6, 7, 10, 15
[sum(y[1:i]) for i = 1:length(y)] # 2, 6, 7, 10, 15
z = similar(y);
cumsum!(z, y); # 2, 6, 7, 10, 15; 破壊的(インプレース)関数
y; # 2, 4, 1, 3, 5
z; 2, 6, 7, 10, 15
積
y = [2, 4, 1, 3, 5];
prod(y) # 120
cumprod, cummin, cummax
[prod(y[1:i]) for i = 1:length(y)] # 2, 8, 8, 24, 120; cumprod() に相当
[minimum(y[1:i]) for i = 1:length(y)] # 2, 2, 1, 1, 1; cummin() に相当
[maximum(y[1:i]) for i = 1:length(y)] # 2, 4, 4, 4, 5; cummax() に相当
不偏共分散,共分散
a = [1, 3, 4, 2, 6];
b = [3, 2, 5, 4, 3];
cov(a, b) # 0.15000000000000002; 不偏共分散
cov(a, b, corrected=false) # 0.12000000000000002; 共分散
ピアソンの積率相関係数
cor(a, b) # 0.06839411288813299; ピアソンの積率相関係数
A = randn(100, 3);
cor(A) # ピアソンの積率相関係数行列
# 3×3 Array{Float64,2}:
# 1.0 0.0227498 0.18433
# 0.0227498 1.0 -0.0643971
# 0.18433 -0.0643971 1.0
ノルム
using LinearAlgebra
norm(a) # 8.12403840463596; ノルム
内積
dot(a, b) # 55; 内積
sum(a .* b) # 55; 内積
外積
a = [1, 2, 3];
b = [10, 20, 30, 40];
a * b' # 外積
# 3×4 Array{Int64,2}:
# 10 20 30 40
# 20 40 60 80
# 30 60 90 120
using StatsBase # geomean, harmmean, quantile, corspearman, corkendall
分位数(パーセンタイル値)
quantile(x)
# -2.3280152457586003; 最小値
# -0.6844644232186423; 25%タイル値
# 0.13578110308214625; 中央値(50%タイル値)
# 0.690881410484019; 75%タイル値
# 2.1307390315181536; 最大値
quantile(x, 0.00) # -2.3280152457586003; 最小値
quantile(x, 0.25) # -0.6844644232186423; 25%タイル値
quantile(x, 0.50) # 0.13578110308214625; 中央値(50%タイル値)
quantile(x, 0.75) # 0.690881410484019; 75%タイル値
quantile(x, 1.00) # 2.1307390315181536; 最大値
quantile!(x, 0.5) # 0.13578110308214625; 破壊的(インプレース)関数
幾何平均
geomean([2, 1, 3, 2, 1]) # 1.6437518295172258; 幾何平均
調和平均
harmmean([2, 1, 3, 2, 1]) # 1.5; 調和平均
スピアマンの順位相関係数
a = [1, 3, 4, 2, 6];
b = [3, 2, 5, 4, 3];
corspearman(a, b) # 0.10259783520851543; スピアマンの順位相関係数
A = randn(10, 3);
corspearman(A); # スピアマンの順位相関係数行列
# 3×3 Array{Float64,2}:
# 1.0 -0.430303 0.00606061
# -0.430303 1.0 -0.139394
# 0.00606061 -0.139394 1.0
ケンドールの順位相関係数
corkendall(a, b) # 0.10540925533894598; ケンドールの順位相関係数
corkendall(A); # ケンドールの順位相関係数行列
# 3×3 Array{Float64,2}:
# 1.0 -0.288889 0.0222222
# -0.288889 1.0 -0.0222222
# 0.0222222 -0.0222222 1.0
集合
v = [2, 2, 4, 4, 4, 4, 1, 3, 3, 3, 5, 5, 5, 5, 5];
A = Set(v); # 4, 2, 3, 5, 1; 集合(要素の順序はない。重複もない。)
B = Set([1, 3, 5, 7, 9]); 7, 9, 3, 5, 1
union(A, B) # 7, 4, 9, 2, 3, 5, 1; 和集合
intersect(A, B) # 3, 5, 1; 積集合
setdiff(A, B) # 4, 2; 差集合
symdiff(A, B) # 7, 4, 9, 2; 対称差集合
A == B # false; 等しい
1 in A # true; 集合に含まれる
0 in A # false
Set() # (); 空集合
empty(A) # (); 空集合にする
要素の置換
v = [2, 4, 1, 3, 5]; # 2, 4, 1, 3, 5
v[[1, 3, 5]] = [10, 30, 50];
v; # 10, 4, 30, 3, 50
ベクトルの結合
u = [1, 2, 3];
v = [4, 5];
w = [6, 7, 8, 9];
vcat(u, v, w); # 1, 2, 3, 4, 5, 6, 7, 8, 9
append!(u, v); # インプレースで結合
append!(u, w);
u; # 1, 2, 3, 4, 5, 6, 7, 8, 9
要素・ベクトルの挿入
a = [1, 2, 3];
pushfirst!(a, 0) # 0, 1, 2, 3; インプレースで先頭に挿入
a = [1, 2, 3];
push!(a, 99) # 1, 2, 3, 99; インプレースで末尾に挿入(追加)
a = [1, 2, 3];
insert!(a, 2, 99) # 1, 99, 2, 3; インプレースでインデックス位置に挿入
u = [1, 2, 3];
v = [4, 5];
[insert!(u, 3, v2) for v2 in reverse(v)]
u; # 1, 2, 4, 5, 3
ベクトルの要素の削除
v = [1, 2, 3, 4, 5];
popfirst!(v) # 1; インプレースで先頭の要素を削除して,返す
v; # 2, 3, 4, 5
v = [1, 2, 3, 4, 5];
pop!(v) # 5; インプレースで最後の要素を削除して,返す
v; # 1, 2, 3, 4
v = [1, 2, 3, 4, 5];
deleteat!(v, 3); # インプレースでインデックス位置の要素を削除(delete at)
v; # 1, 2, 4, 5
empty!(v); # 空ベクトルにする
v; # Int64[]
要素ごとの演算
v = [2, 4, 1, 3, 5];
w = [1, 3, 5, 7, 9];
v + w; # 3, 7, 6, 10, 14
v .+ w; # 3, 7, 6, 10, 14
v - w; # 1, 1, -4, -4, -4
v .- w; # 1, 1, -4, -4, -4
v .* w; # 2, 12, 5, 21, 45
v * w; # エラー MethodError: no method matching *(::Array{Int64,1}, ::Array{Int64,1})
v ./ w; # 2.0, 1.3333333333333333, 0.2, 0.42857142857142855, 0.5555555555555556
v / w # 注! 5 x 5 配列
# 5×5 Array{Float64,2}:
# 0.0121212 0.0363636 0.0606061 0.0848485 0.109091
# 0.0242424 0.0727273 0.121212 0.169697 0.218182
# 0.00606061 0.0181818 0.030303 0.0424242 0.0545455
# 0.0181818 0.0545455 0.0909091 0.127273 0.163636
# 0.030303 0.0909091 0.151515 0.212121 0.272727
v .+ 1; # 3, 5, 2, 4, 6
v + 1; # エラー MethodError: no method matching +(::Array{Int64,1}, ::Int64)
v * 2; # 4, 8, 2, 6, 10
v .* 2; # 4, 8, 2, 6, 10
v .^ 2; # 4, 16, 1, 9, 25
v ^ 2; # エラー MethodError: no method matching ^(::Array{Int64,1}, ::Int64)
1 ./ v # 0.5, 0.25, 1.0, 0.333, 0.2
1 / v # 0.0363636 0.0727273 0.0181818 0.0545455 0.0909091 ?? どういう計算?
v .< 3 # 1, 0, 1, 0, 0
mod.(v, 2) # 0, 0, 1, 1, 1
mod.(v, 2) .== 0; # 1, 1, 0, 0, 0
sqrt.(v); # 1.41421, 2.0, 1.0, 1.73205, 2.23607
exp.(v); # 7.38906, 54.5982, 2.71828, 20.0855, 148.413
定数
円周率
pi # π = 3.1415926535897... 円周率
π # π = 3.1415926535897...; # \pi<tab> で入力
typeof(π) # Irrational{:π}
1pi # 3.141592653589793
typeof(1pi) # Float64
BigFloat(pi) # 3.141592653589793238462643383279502884197169399375105820974944592307816406286198
BigFloat(1) + pi # 4.141592653589793238462643383279502884197169399375105820974944592307816406286198
BigFloat(1) + Float64(pi) # 4.141592653589793115997963468544185161590576171875
1 + pi # 4.141592653589793
Float64(pi) # 3.141592653589793
1024 ビットにする
setprecision(BigFloat, 1024) do
BigFloat(pi)
end
# 3.14159265358979323846264338...24586997
ネイピア数
ℯ # ℯ = 2.7182818284590...; \euler<tab> で入力; ネイピア数
typeof(ℯ) # Irrational{:ℯ}
BigFloat(ℯ) # 2.718281828459045235360287471352662497757247093699959574966967627724076630353555
1ℯ # 2.718281828459045