in 演算子
# Python
a = range(1, 11)
3 in range(1, 11) # True
3 in a # True
not(3 in a) # False
20 not in a # True
# R
a = 1:10
3 %in% a # TRUE
!(3 %in% a) # FALSE
20 %in% a # FALSE
# Julia
a = 1:10 # 1:10
b = collect(a) # [1, 2, ..., 9, 10]
typeof(a) # UnitRange{Int64}
typeof(b) # Array{Int64,1}
3 in a # true
3 in b # true
!(3 in a) # false
20 in a # false
どこにあるか
# Python
a = [3, 1, 0, 2, 4, 0, 3, 5, 4, 2]
a.index(4) # 4
#
b = np.array([3, 2, 1, 2, 3, 4, 1])
c = np.where(b == 1) # (array([2, 6]),)
c[0] # array([2, 6])
c[0][0] # 2
c[0][1] # 6
# R
a = c(3, 1, 0, 2, 4, 0, 3, 5, 4, 2)
which(a == 4) # 5, 9
# Julia
a = [3, 1, 0, 2, 4, 0, 3, 5, 4, 2]
findfirst(==(4), a) # 5
findfirst(isequal(4), a) # 5
#
findfirst(>(3), a) # 5
findall(iseven, a) # [3, 4, 5, 6, 9, 10]
findall(isodd, a) # [1, 2, 7, 8]
#
findfirst(==(3), a) # 1
findlast(==(3), a) # 7
findall(==(3), a) # [1, 7]
いくつあるか
# Python
a = [3, 1, 0, 2, 4, 0, 3, 5, 4, 2]
a.count(3) # 2
# R
a = c(3, 1, 0, 2, 4, 0, 3, 5, 4, 2)
length(which(a == 3)) # 2
# Julia
a = [3, 1, 0, 2, 4, 0, 3, 5, 4, 2]
count(==(3), a) # 2
count(isequal(3), a) # 2
三項演算子
# Python
i = 6
a = "even" if i % 2 == 0 else "odd" # 'even'
# R
i = 6
a = if (i %% 2 == 0) "even" else "odd" # "even"
# Julia
i = 6
a = i % 2 == 0 ? "even" : "odd" # "even"
条件により実行される演算を選択する
# Python
import numpy as np
a = np.array([2, 3, 5, 6, 8])
b = np.where(a % 2 == 0, a*10, 0) # array([20, 0, 0, 60, 80])
# R
a = c(2, 3, 5, 6, 8)
b = ifelse(a %% 2 == 0, a*10, 0) # c(20, 0, 0, 60, 80)
# Julia
a = [2, 3, 5, 6, 8];
b = map(x -> x % 2 == 0 ? 10x : 0, a) # [20, 0, 0, 60, 80]
リスト(配列)同士の連結
# Python
a = [1, 2, 3]
b = [11, 12]
x = a + b # [1, 2, 3, 11, 12]; インプレースではない
#
import operator as op
y = op.concat(a, b) # [1, 2, 3, 11, 12]
#
a.extend(b) # [1, 2, 3, 11, 12]; a にインプレースで連結
#
a2 = np.array([1, 2, 3])
b2 = np.array([11, 12])
x = np.hstack((a2, b2)) # array([1, 2, 3, 11, 12]); インプレースではない
# R
a = c(1, 2, 3)
b = c(11, 12)
x = c(a, b) # c(1, 2, 3, 11, 12); インプレースではない
y = append(a, b) # c(1, 2, 3, 11, 12); インプレースではない
# Julia
a = [1, 2, 3];
b = [11, 12];
x = vcat(a, b) # [1, 2, 3, 11, 12]; インプレースではない
append!(a, b) # [1, 2, 3, 11, 12]; a にインプレースで連結
リストに変数を連結
# Python
a = [1, 2, 3]
b = 5
x = a + [b] # [1, 2, 3, 5]; インプレースではない
a.append(b) # [1, 2, 3, 5]; a にインプレースで連結
#
a2 = np.array([1, 2, 3])
b = 5
x = np.hstack((a2, b)) # [1, 2, 3, 5]; インプレースではない
# R
a = c(1, 2, 3)
b = 5
x = c(a, b) # c(1, 2, 3, 5); インプレースではない
y = append(a, b) # c(1, 2, 3, 5); インプレースではない
# Julia
a = [1, 2, 3]
b = 5
x = vcat(a, b) # [1, 2, 3, 5]; インプレースではない
append!(a, b) # [1, 2, 3, 5]; a にインプレースで追加
リストに変数を挿入
# Python
a = [1, 2, 3]
b = 5
a.insert(0, b) # [5, 1, 2, 3]; a にインプレースで挿入
# R
a = c(1, 2, 3)
b = 5
x = append(a, b, 0) # c(5, 1, 2, 3); インプレースではない
# Julia
a = [1, 2, 3]
b = 5
insert!(a, 1, b) # [5, 1, 2, 3]; a にインプレースで挿入
要素の全削除
# Python
a = [1, 2, 3]
a.clear()
a # []; 要素がなくなるのであって,a 自体がなくなるわけではない
# R
a = c(1, 2, 3)
a = NULL
a # NULL; 要素がなくなるのであって,a 自体がなくなるわけではない
# Julia
a = [1, 2, 3]
empty!(a)
a # Int64[]; 要素がなくなるのであって,a 自体がなくなるわけではない
要素の削除
# Python
a = [1, 2, 3]
del a[1] # インデックスを指定して要素を削除
a # [1, 3]
#
a = [1, 2, 3]
a.remove(3) # 指定する値を持つ要素をインプレースで削除
a # [1, 2]
# R
a = c(1, 2, 3)
a = a[-2] # インプレースではないため,結果を反映させるためには代入が必要
# Julia
a = [1, 2, 3];
deleteat!(a, 2) # a からインプレースで削除
a # [1, 3]
要素のポップ
# Python
a = [3, 2, 1, 4, 3]
a.pop() # 3; 取り出された要素
a # [3, 2, 1, 4]
#
a = [3, 2, 1, 4, 3 ]
a.pop(1) # 2; 取り出された要素
a # [3, 1, 4, 3]
# R 以下の関数では,取り出した要素は把握できない
pop = function(a, i=length(a)) a[-i]
#
a = c(3, 2, 1, 4, 3)
a = pop(a)
a # c(3, 2, 1, 4)
#
a = c(3, 2, 1, 4, 3)
a = pop(a, 3)
a # c(3, 2, 4, 3)
# Julia
a = [3, 2, 1, 4, 3];
pop!(a) # 3; 取り出された要素
a # [3, 2, 1, 4] # a からインプレースで最後の要素を取り出す
#
a = [3, 2, 1, 4, 3];
popfirst!(a) # 3; 取り出された要素
a # [2, 1, 4, 3] # a からインプレースで最初の要素を取り出す
要素のプッシュ
# Python
a = [3, 2, 1, 4, 3]
a.append(88) # 最後の要素としてインプレースで付け加える(insert を使ってもよい)
a.insert(3, 99) # [3, 2, 1, 99, 4, 3, 88]; 3 番目の要素としてインプレースで挿入
# R
a = c(3, 2, 1, 4, 3)
a = append(a, 88) # インプレースではないので,代入しないと変化なし
a = append(a, 99, 3) # インプレースではないので,代入しないと変化なし
a # c(3, 2, 1, 99, 4, 3, 88)
# Julia
a = [3, 2, 1, 4, 3];
pushfirst!(a, 10) # a にインプレースで先頭に要素を押し込む
push!(a, 20) # a にインプレースで最後尾に要素を押し込む
a # [10, 3, 2, 1, 4, 3, 20]
リストの繰り返し
# Python
a = [1, 2, 3]
b = a*3 # [1, 2, 3, 1, 2, 3, 1, 2, 3]
#
np.tile(a, 3) # array([1, 2, 3, 1, 2, 3, 1, 2, 3])
#
np.repeat(a, 3) # array([1, 1, 1, 2, 2, 2, 3, 3, 3])
#
np.repeat(np.array([1,2]), [2,3]) # array([1, 1, 2, 2, 2])
# R
rep(c(1, 2, 3), 3) # c(1, 2, 3, 1, 2, 3, 1, 2, 3)
#
rep(c(1, 2, 3), each=3) # c(1, 1, 1, 2, 2, 2, 3, 3, 3)
#
rep(c(1, 2), c(2, 3)) # c(1, 1, 2, 2, 2)
# Julia
repeat([1, 2, 3], 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
#
repeat([1 2 3], inner=(1, 2)) # [1 1 2 2 3 3]; 1x6 行列
reshape(repeat([1 2 3], inner=(1,2)), 6, :) # [1, 1, 2, 2, 3, 3]; 6x1 行列
#
# 関数定義
repeateach(x, n) = vec([j for i = 1:n, j in x])
a = repeateach([1, 2, 3], 3) # [1, 1, 1, 2, 2, 2, 3, 3, 3]
a = repeateach(["a", "b", "c"], 2) # ["a", "a", "b", "b", "c", "c"]