そろそろ julia 0.6 から julia 1.0 に移行できるかな? でも変更点多数ですね。
RCall と PyCall が動いたので julia 0.6 から julia 1.0 に移行できるかもしれません。
でも、なぜか .juliarc を読んでくれていないようです。
他にも、戸惑うこと多数です。0.6 のコピー&ペーストは、まず動きません。
きっと短めのプログラムから、少しずつ、自分の方が、適応していかないといけないのでしょう。
日付を扱う Base.Dates が、Dates になっているようです
_ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.0.0 (2018-08-08) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | julia> Date(2018) ERROR: UndefVarError: Date not defined Stacktrace: [1] top-level scope at none:0 julia> using Base.Dates ERROR: UndefVarError: Dates not defined julia> using Dates julia> Date(2018) 2018-01-01
パスの指定時のエスケープシークエンスの使い方が代わっているようです
julia> cd("./Google\ ドライブ/") ERROR: syntax: invalid escape sequence julia> cd("./Google ドライブ/")
missing だらけの Array や DataFrame を作ってくれる
julia> Array{Any}(missing, 5,5) 5×5 Array{Any,2}: missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing julia> A1[1,1] = "foo" "foo" julia> A1[1,2]=3.14 3.14 julia> DataFrame(A1) 5×5 DataFrame │ Row │ x1 │ x2 │ x3 │ x4 │ x5 │ ├─────┼─────────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ foo │ 3.14 │ missing │ missing │ missing │ │ 2 │ missing │ missing │ missing │ missing │ missing │ │ 3 │ missing │ missing │ missing │ missing │ missing │ │ 4 │ missing │ missing │ missing │ missing │ missing │ │ 5 │ missing │ missing │ missing │ missing │ missing │ julia> A2 = Array{Any}(missing,8,5) 8×5 Array{Any,2}: missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing missing julia> DataFrame(A2) 8×5 DataFrame │ Row │ x1 │ x2 │ x3 │ x4 │ x5 │ ├─────┼─────────┼─────────┼─────────┼─────────┼─────────┤ │ 1 │ missing │ missing │ missing │ missing │ missing │ │ 2 │ missing │ missing │ missing │ missing │ missing │ │ 3 │ missing │ missing │ missing │ missing │ missing │ │ 4 │ missing │ missing │ missing │ missing │ missing │ │ 5 │ missing │ missing │ missing │ missing │ missing │ │ 6 │ missing │ missing │ missing │ missing │ missing │ │ 7 │ missing │ missing │ missing │ missing │ missing │ │ 8 │ missing │ missing │ missing │ missing │ missing │
ERROR syntax が容赦ない
julia> &(false, true) ERROR: syntax: invalid syntax &(Core.tuple(false, true)) julia> .&(false, true) false
mean() すら using Statistics が必要で、dims= というのが必要
julia 1.0 は起動が早いが、色々なものが動いていないようです。
julia> mean ERROR: UndefVarError: mean not defined julia> using Statistics julia> mean mean (generic function with 7 methods) julia> A = [1 2 ; 3 4] 2×2 Array{Int64,2}: 1 2 3 4 julia> mean(A,1) ERROR: MethodError: no method matching mean(::Array{Int64,2}, ::Int64) ...略 julia> mean(A,dims=1) 1×2 Array{Float64,2}: 2.0 3.0
DataFrame を Array に変換できない
julia> using DataFrames # 今のところ、毎回必要!! julia> hoge = DataFrame(a=[1,2],b=[3,4]) 2×2 DataFrame │ Row │ a │ b │ ├─────┼───┼───┤ │ 1 │ 1 │ 3 │ │ 2 │ 2 │ 4 │ julia> Array(hoge) ERROR: MethodError: no method matching Array(::DataFrame) ...略
今のところ、下記のようにするしかないようです。
julia> Array(hcat(df[1],df[2])) 2×2 Array{Int64,2}: 1 2 3 4
もちろん、関数を定義するもよろし。
julia> function df2array(df1::DataFrame) A = Array{Any}(missing, size(df1)) for i in 1:length(df1) A[:,i] = df1[:,i] end return A end df2array (generic function with 1 method) julia> hoge = DataFrame(a=[1,2],b=[3,4]) 2×2 DataFrame │ Row │ a │ b │ ├─────┼───┼───┤ │ 1 │ 1 │ 3 │ │ 2 │ 2 │ 4 │ julia> df2array(hoge) 2×2 Array{Any,2}: 1 3 2 4 julia> mean(df2array(hoge), dims=2) 2×1 Array{Float64,2}: 2.0 3.0
"2×2 Array{Int64,2}" よりも、メモリーを食べるのかもしれませんが、まあ、ご愛嬌
Array でないと mean() やら std() やら色々動かないので、現段階では、仕事になりません。
もちろん julia 0.6 なら動きます。
_ _ _ _(_)_ | A fresh approach to technical computing (_) | (_) (_) | Documentation: https://docs.julialang.org _ _ _| |_ __ _ | Type "?help" for help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 0.6.4 (2018-07-09 19:09 UTC) _/ |\__'_|_|_|\__'_| | Official http://julialang.org/ release |__/ | x86_64-apple-darwin14.5.0 julia> hoge = DataFrame(a=[1,2],b=[3,4]) 2×2 DataFrames.DataFrame │ Row │ a │ b │ ├─────┼───┼───┤ │ 1 │ 1 │ 3 │ │ 2 │ 2 │ 4 │ julia> Array(hoge) 2×2 Array{Int64,2}: 1 3 2 4
contains() が廃止、ismatch()は occursin() になっている
contains() が廃止で、ismatch() が occursin() になっています。julia 0.6 で warning が出ていませんでしたが、突如(?) 起き変っています。ismatch() と同じ文法らしので、contains() とは ()内は、逆順です。もちろん、ブロードキャストも動きます。正規表現も効きますが、下記の注意を参照です。julia 0.6 までのコードは書き変えが必要です。
正規表現を使う時は、1つの要素なら良いですが、ベクトルやArray に使うには、map または broadcast が必要なようです。
julia> occursin(r"^り", string("りんご")) true julia> A1 = ["りんご","バナナ","ぶどう"] 3-element Array{String,1}: "りんご" "バナナ" "ぶどう" julia> occursin(r"^り", A1[1]) true julia> occursin(r"^り", A1) ERROR: MethodError: no method matching occursin(::Regex, ::Array{String,1}) Closest candidates are: occursin(::Regex, ::SubString; offset) at regex.jl:160 occursin(::Regex, ::AbstractString; offset) at regex.jl:154 Stacktrace: [1] top-level scope at none:0 julia> occursin.(r"^り", A1) ERROR: MethodError: no method matching length(::Regex) 略 julia> map(x->occursin.(r"^り", x), A1) ERROR: MethodError: no method matching length(::Regex) 略 julia> map(x->occursin(r"^り", x), A1) 3-element Array{Bool,1}: true false false
find が findall などに置き換わっている
julia> find([false, true]) ERROR: UndefVarError: find not defined Stacktrace: [1] top-level scope at none:0 julia> findall([false, true]) 1-element Array{Int64,1}: 2
ベクトルの一部を書き変える時の ".=" が厳格化している
A というベクトルの特定の要素だけを、ベクトルBを作りたいとします。
[1,2,3] の3だけ、4に起き変えたいと、しましょう。1つだけですが、".="になります。
1.0
julia> A = [1,2,3] 3-element Array{Int64,1}: 1 2 3 julia> B= deepcopy(A) 3-element Array{Int64,1}: 1 2 3 julia> B[B.==3]=4 ERROR: MethodError: no method matching setindex_shape_check(::Int64, ::Int64) ...略 julia> B[B.==3].=4 1-element view(::Array{Int64,1}, [3]) with eltype Int64: 4
なにげなく、df= DataFrame(hoge,hoge) みたいに書きたくなります。なんと、StatsBase.df とダブると怒られます。私は StatsBase.countmap() を良く使うので、StatsBase を using している為です。
julia> df = deepcopy(df_hoge) ERROR: cannot assign variable StatsBase.df from module Main julia> df1 = deepcopy(df_hoge) # これはOK help?> df search: df df1 df_in1 df2array df_total1 df_disease df_residual df_age_group df_prefecture modf ecdf findfirst meltdf RoundFromZero stackdf dof diff dof_residual undef isdefined rcdefaults No documentation found. StatsBase.df is a Function. # 1 method for generic function "df": [1] df(obj::StatisticalModel) in StatsBase at deprecated.jl:53
type ... end が、struct ... end に変更になっている (python の class ... __init__ ...ってやつです)
python で言うところのクラスの定義は、0.6 までは、type ... end でした。1.0 は、struct ... end になっているようです。
julia> struct Points x::Float64 y::Float64 end julia> Points(1,2) Points(1.0, 2.0) julia> p1=Points(1,2) Points(1.0, 2.0) julia> p1.x 1.0 julia> p1.y 2.0
文字列Array に、replace. が効かない -> map() が必要
文字列の Array やベクトルに replace のブロードキャストが働かなくなっています。map を使わないといけません。
julia> A = ["ABC", "BCD" , "CDF"] 3-element Array{String,1}: "ABC" "BCD" "CDF" julia> replace.(A, "B" =>"b") ERROR: DimensionMismatch("arrays could not be broadcast to a common size") Stacktrace: [1] _bcs1 at ./broadcast.jl:439 [inlined] [2] _bcs at ./broadcast.jl:433 [inlined] [3] broadcast_shape at ./broadcast.jl:427 [inlined] [4] combine_axes at ./broadcast.jl:422 [inlined] [5] instantiate at ./broadcast.jl:266 [inlined] [6] materialize(::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1},Nothing,typeof(replace),Tuple{Array{String,1},Array{String,1}}}) at ./broadcast.jl:748 [7] top-level scope at none:0 julia> map(x -> replace(x, "B" =>"b"), A) 3-element Array{String,1}: "AbC" "bCD" "CDF"
まだ、色々ありそう。しばらく、おとなしく、julia 0.6 を使うも、ひとつの判断ですね。