裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Julia のベクトル(その 2)

2021年02月08日 | ブログラミング

並べ替え

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

 

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Julia のベクトル(その 1) | トップ | Julia で使える R のデータセ... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事