Julia 0.6 から 1.x への移植

整数の直後にドット . と演算子を続けて書かない

例えば、2.+3 のように、整数の直後にドット (ピリオド .)と演算子を置く式は禁止された。 空白を挿入して、次の二つを明示する。

  • 整数 2 に(配列などを)加算する(+)場合は、整数 2 の後に空白を置く。
  • 浮動小数点数 2. に加算する場合は、+ の前に空白を置く。
julia> # 2.+3 # => エラー
       2 .+3  # => 整数
5

julia> 2. +3  # => 浮動小数点数
5.0

配列とスカラーの加減算は .+, .- を用いる

v0.6.4 では、 配列 v にスカラー a を加減する (v+a または v-a) ことができたが、 v1.x ではできなくなった。 代わりに、v .+ a または v .- a とする。 あるいは、式の前に @. を置いて、@. v+a または @. v-a と書いてもよい。

1次元配列 (ベクトル)の場合

julia> v=[ 1, 2, 3, 4]
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> v+1 # エラー
ERROR: MethodError: no method matching +(::Array{Int64,1}, ::Int64)
Closest candidates are:
  +(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:502
  +(!Matched::Complex{Bool}, ::Real) at complex.jl:292
  +(!Matched::Missing, ::Number) at missing.jl:97
  ...

julia> v.+1
4-element Array{Int64,1}:
 2
 3
 4
 5

julia> @. v+1
4-element Array{Int64,1}:
 2
 3
 4
 5

julia> v-1 # エラー
ERROR: MethodError: no method matching -(::Array{Int64,1}, ::Int64)
Closest candidates are:
  -(!Matched::Complex{Bool}, ::Real) at complex.jl:298
  -(!Matched::Missing, ::Number) at missing.jl:97
  -(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
  ...

julia> v.-1
4-element Array{Int64,1}:
 0
 1
 2
 3

julia> @. v-1
4-element Array{Int64,1}:
 0
 1
 2
 3

2次元配列 (行列)の場合

julia> m=[ 1 2; 3 4]
2×2 Array{Int64,2}:
 1  2
 3  4

julia> m+1 # エラー
ERROR: MethodError: no method matching +(::Array{Int64,2}, ::Int64)
Closest candidates are:
  +(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:502
  +(!Matched::Complex{Bool}, ::Real) at complex.jl:292
  +(!Matched::Missing, ::Number) at missing.jl:97
  ...

julia> m.+1
2×2 Array{Int64,2}:
 2  3
 4  5

julia> @. m+1
2×2 Array{Int64,2}:
 2  3
 4  5

julia> m-1 # エラー
ERROR: MethodError: no method matching -(::Array{Int64,2}, ::Int64)
Closest candidates are:
  -(!Matched::Complex{Bool}, ::Real) at complex.jl:298
  -(!Matched::Missing, ::Number) at missing.jl:97
  -(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
  ...

julia> m.-1
2×2 Array{Int64,2}:
 0  1
 2  3

julia> @. m-1
2×2 Array{Int64,2}:
 0  1
 2  3

配列とスカラーの加減算による更新は .+=, .-= を用いる

v0.6.4 では、 配列 v にスカラー a を加減して更新できた (v+a または v-a) が、 v1.x ではできなくなった。 代わりに、v.+=a または v.=a とする。 あるいは、式の前に @. を置いて、@. v+=a または @. v-=a と書いてもよい。

1次元配列 (ベクトル)の場合

julia> v=[ 1, 2, 3, 4]
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> v+=1 # エラー
ERROR: MethodError: no method matching +(::Array{Int64,1}, ::Int64)
Closest candidates are:
  +(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:502
  +(!Matched::Complex{Bool}, ::Real) at complex.jl:292
  +(!Matched::Missing, ::Number) at missing.jl:97
  ...

julia> v.+=1
4-element Array{Int64,1}:
 2
 3
 4
 5

julia> @. v+=1
4-element Array{Int64,1}:
 3
 4
 5
 6

julia> v-=1 # エラー
ERROR: MethodError: no method matching -(::Array{Int64,1}, ::Int64)
Closest candidates are:
  -(!Matched::Complex{Bool}, ::Real) at complex.jl:298
  -(!Matched::Missing, ::Number) at missing.jl:97
  -(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
  ...

julia> v.-=1
4-element Array{Int64,1}:
 2
 3
 4
 5

julia> @. v-=1
4-element Array{Int64,1}:
 1
 2
 3
 4

2次元配列 (行列)の場合

julia> m=[ 1 2; 3 4]
2×2 Array{Int64,2}:
 1  2
 3  4

julia> m+=1 # エラー
ERROR: MethodError: no method matching +(::Array{Int64,2}, ::Int64)
Closest candidates are:
  +(::Any, ::Any, !Matched::Any, !Matched::Any...) at operators.jl:502
  +(!Matched::Complex{Bool}, ::Real) at complex.jl:292
  +(!Matched::Missing, ::Number) at missing.jl:97
  ...

julia> m.+=1
2×2 Array{Int64,2}:
 2  3
 4  5

julia> @. m+=1
2×2 Array{Int64,2}:
 3  4
 5  6

julia> m-=1 # エラー
ERROR: MethodError: no method matching -(::Array{Int64,2}, ::Int64)
Closest candidates are:
  -(!Matched::Complex{Bool}, ::Real) at complex.jl:298
  -(!Matched::Missing, ::Number) at missing.jl:97
  -(!Matched::Base.CoreLogging.LogLevel, ::Integer) at logging.jl:107
  ...

julia> m.-=1
2×2 Array{Int64,2}:
 2  3
 4  5

julia> @. m-=1
2×2 Array{Int64,2}:
 1  2
 3  4

なお、配列 v にスカラー a を乗除して更新すること (v*=a または v/=a) は v1.x でも可能である。

julia> v=[ 1, 2, 3, 4]
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> v*=2
4-element Array{Int64,1}:
 2
 4
 6
 8

julia> v/=2
4-element Array{Float64,1}:
 1.0
 2.0
 3.0
 4.0

zeros(a) は廃止。zero(a)を用いる

v0.6.4 では、配列 a に対して zeros(a) というメソッドがあったが、廃止された。 v1.x では、代わりに zero(a) を用いる。

このメソッドは、a の要素と同じ要素の型で、a と同じ寸法の配列を作り、 要素の値を全て 0 にする命令である。

julia> a=[1 2; 3 4]
2×2 Array{Int64,2}:
 1  2
 3  4

julia> zeros(a) # エラー
ERROR: MethodError: no method matching zeros(::Array{Int64,2})
Closest candidates are:
  zeros(!Matched::Union{Integer, AbstractUnitRange}...) at array.jl:448
  zeros(!Matched::Type{StaticArrays.SArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/SVector.jl:29
  zeros(!Matched::Type{StaticArrays.MArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/MVector.jl:27
  ...

julia> zero(a)
2×2 Array{Int64,2}:
 0  0
 0  0

julia> a *= 1.0
2×2 Array{Float64,2}:
 1.0  2.0
 3.0  4.0

julia> zeros(a)
ERROR: MethodError: no method matching zeros(::Array{Float64,2})
Closest candidates are:
  zeros(!Matched::Union{Integer, AbstractUnitRange}...) at array.jl:448
  zeros(!Matched::Type{StaticArrays.SArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/SVector.jl:29
  zeros(!Matched::Type{StaticArrays.MArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/MVector.jl:27
  ...

ones(a) は廃止。one(a)を用いる

v0.6.4 では、配列 a に対して ones(a) というメソッドがあったが、廃止された。 v1.1 では、代わりに one(a) を用いる。

このメソッドは、a の要素と同じ要素の型で、a と同じ寸法の配列を作り、 要素の値を全て 1 にする命令である。

julia> a=[1 2; 3 4]
2×2 Array{Int64,2}:
 1  2
 3  4

julia> ones(a) # エラー
ERROR: MethodError: no method matching ones(::Array{Int64,2})
Closest candidates are:
  ones(!Matched::Union{Integer, AbstractUnitRange}...) at array.jl:448
  ones(!Matched::Type{StaticArrays.SArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/SVector.jl:30
  ones(!Matched::Type{StaticArrays.MArray{Tuple{N},T,1,N} where T}) where N at /Users/hs/.julia/packages/StaticArrays/1g9bq/src/MVector.jl:28
  ...

julia> one(a)
2×2 Array{Int64,2}:
 1  0
 0  1

julia> a *= 1.0
2×2 Array{Float64,2}:
 1.0  2.0
 3.0  4.0

julia> one(a)
2×2 Array{Float64,2}:
 1.0  0.0
 0.0  1.0

realmax(t), realmin(t) は廃止。floatmax(t), floatmin(t) を用いる

v0.6.4 の、型 t に対する関数 realmax(a), realmin は廃止となった。 代わりに、 v0.6.4 の、型 t に対する関数 floatmax(a), floatmin を用いる。

これらは各々、型 t で表される最大の数、最小の数を返す。

bits は廃止。bitstringを用いる。

PyPlot パッケージでは o.m の形式が推奨される

v0.6.4 では、PyPlot パッケージで o[:s] の形で、 オブジェクト o のシンボル s を読むが、推奨されなくなった。 代わりに、o.s の形を使うことが推奨される。

  • plt[:figure]plt.figure とする。
  • ax1[:plot]ax1.plot とする。

更に、グラフ描画パッケージ PyPlot.jl が依存する グラフィクス・ライブラリ Matplotlab の呼び出し形式が変更されたために、 修正が必要となる。

アスペクト比 (縦横の寸法の比) を等しくするのに、従来は、 plt[:axes]()[:set_aspect]("equal") と書いていた。 現行は、plt.subplots() 関数を用いて、軸オブジェクト ax を取得してから、 ax.set_aspect("equal") とする。以下の例を見よ、

using PyPlot
fig, ax1 = plt.subplots()
xs=-1:0.1:1
ys=xs.^2;
zs=xs.^3;
ax1.set_aspect("equal")
ax1.plot(xs,ys)
ax1.plot(xs,zs)

描画範囲を分割するに従来用いてきた plt.add_subplot() の形式は将来廃止される予定である。 現行では、plt.subfigures() 関数を用いて、描画前に分割する。

using PyPlot
# fig=plt.figure() # v0.6
# fig, axes = plt.subplots(nrows=1,ncols=2) # v0.6, 縦に 1つ、横に 2つ
fig, axes = plt.subplots(1,2)
ax1=axes[1]
ax1.plot([3,2,1])
ax2=axes[2]
ax2.plot([2,3,1])

linspace は廃止。range を用いる

v0.6.4 では

  • linspace(a,b) は、初項 a、最終項 b, 長さ 50 の等差数列を作る。
  • linspace(a,b,n) は、初項 a、最終項 b, 長さ n の等差数列を作る。

linspace 関数は、v1.x で廃止された。

代わりに、関数 range を用いる。

関数 range は、引数として、初項を必ず指定する必要がある。 関数 range に、2つの数字を引数に指定すると、2つ目の引数は最終項である。 要素の数は、キーワード引数 length で指定する。 最終項目は、キーワード引数 stop で指定することもできる。 さらに、キーワード引数として、数列の長さ length、等差 step を指定できる。 step の既定値は 1 である。

julia> range(1,10) # エラー
┌ Warning: `range(start, stop)` (with neither `length` nor `step` given) is deprecated, use `range(start, stop=stop)` instead.
│   caller = top-level scope at none:0
└ @ Core none:0
1:10

julia> # 初項 1, 最終項 10, 等差 1 (指定しない)
       range(1,10,length=10)
1.0:1.0:10.0

julia> # 初項 1, 最終項 10, 等差 2
       range(1,10,step=2)
1:2:9

julia> collect(ans)
5-element Array{Int64,1}:
 1
 3
 5
 7
 9

なお、 最終項 stopと長さ length が指定され、等差 step が指定されない場合には、step は、計算される。 したがって、v0.6.4 の linspace(-1,1) に対応する、 もう一つの書き方は range(-1,1,length=50) である。

julia> r1=LinRange(-1,1,50)
50-element LinRange{Float64}:
 -1.0,-0.959184,-0.918367,-0.877551,-0.836735,…,0.877551,0.918367,0.959184,1.0

julia> r2=range(-1,1,length=50)
-1.0:0.04081632653061224:1.0

両者は計算方法が異なるので、数値は微妙に異なる。

julia> r1=collect(r1)
50-element Array{Float64,1}:
 -1.0
 -0.9591836734693877
 -0.9183673469387754
 -0.8775510204081634
 -0.8367346938775511
 -0.7959183673469388
 -0.7551020408163265
 -0.7142857142857144
 -0.6734693877551021
 -0.6326530612244898
  ⋮
  0.6734693877551021
  0.7142857142857142
  0.7551020408163265
  0.7959183673469388
  0.8367346938775511
  0.8775510204081634
  0.9183673469387754
  0.9591836734693877
  1.0

julia> r2=collect(r2)
50-element Array{Float64,1}:
 -1.0
 -0.9591836734693877
 -0.9183673469387755
 -0.8775510204081632
 -0.8367346938775511
 -0.7959183673469388
 -0.7551020408163265
 -0.7142857142857143
 -0.673469387755102
 -0.6326530612244898
  ⋮
  0.673469387755102
  0.7142857142857143
  0.7551020408163265
  0.7959183673469388
  0.8367346938775511
  0.8775510204081632
  0.9183673469387755
  0.9591836734693877
  1.0

julia> r1 .== r2 # 全て true ではない
50-element BitArray{1}:
  true
  true
 false
 false
  true
  true
  true
 false
 false
  true
     ⋮
 false
 false
  true
  true
  true
 false
 false
  true
  true

julia> abs.(r1 .- r2) # 残余
50-element Array{Float64,1}:
 0.0
 0.0
 1.1102230246251565e-16
 1.1102230246251565e-16
 0.0
 0.0
 0.0
 1.1102230246251565e-16
 1.1102230246251565e-16
 0.0
 ⋮
 1.1102230246251565e-16
 1.1102230246251565e-16
 0.0
 0.0
 0.0
 1.1102230246251565e-16
 1.1102230246251565e-16
 0.0
 0.0

julia> isapprox.(r1,r2) # 全て true となる
50-element BitArray{1}:
 true
 true
 true
 true
 true
 true
 true
 true
 true
 true
    ⋮
 true
 true
 true
 true
 true
 true
 true
 true
 true

logspaceは廃止。exp10.(range(a,b)) などを用いる

v0.6.4で、$10$ のべき乗で等比数列を作る logspace は、v1.x で廃止された。 代わりに、exp10.(range(a,b,length=n)) などを用いる。

julia> logspace(-2,2,5) # エラー
ERROR: UndefVarError: logspace not defined

julia> exp10.(LinRange(-2,2,5)) # LinRange を用いる
5-element Array{Float64,1}:
   0.01
   0.1
   1.0
  10.0
 100.0

julia> exp10.(range(-2,stop=2,length=5)) # range を用いる
5-element Array{Float64,1}:
   0.01
   0.1
   1.0
  10.0
 100.0

srand(n) は廃止。Random.seed!(n) を用いる

v0.6.4 では、関数 srand(m) を用いて、 乱数の種をリセットしたが、v1.x では廃止された。

代わりに、Random パッケージを using してから Random.seed!(n) を用いる。

julia> srand(1234) # エラー
ERROR: UndefVarError: srand not defined

julia> using Random # Random パッケージを読み込む

julia> Random.seed!(1234)
Random.MersenneTwister(UInt32[0x000004d2], Random.DSFMT.DSFMT_state(Int32[-1393240018, 1073611148, 45497681, 1072875908, 436273599, 1073674613, -2043716458, 1073445557, -254908435, 1072827086  …  -599655111, 1073144102, 367655457, 1072985259, -1278750689, 1018350124, -597141475, 249849711, 382, 0]), [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0  …  0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], UInt128[0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000  …  0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000, 0x00000000000000000000000000000000], 1002, 0)