そろそろ 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 を使うも、ひとつの判断ですね。