Julia いろいろ--005--

Julia いろいろ--005--

## 配列の出力

以下のように定義された 3 × 4 行列がある。


```julia
a = rand(3, 4)
```




    3×4 Matrix{Float64}:
     0.0242537  0.783368  0.297257  0.0832976
     0.59136    0.386452  0.380821  0.79838
     0.464914   0.708715  0.783134  0.724797



println()，print() での出力は場合によっては不適切である。


```julia
println(a)
```

    [0.024253653447755097 0.7833680829667412 0.2972569608892649 0.08329758490218564; 0.5913601626927224 0.38645181482753643 0.3808213689242702 0.798379598713088; 0.4649140344426208 0.7087146933352596 0.7831337009609467 0.7247970281267975]


桁数を指定しても見にくいことに変わりはない。


```julia
print(round.(a, digits=3))
```

    [0.024 0.783 0.297 0.083; 0.591 0.386 0.381 0.798; 0.465 0.709 0.783 0.725]

display() を使うと少しはましになる。REPL の出力は display() によるものだろうか。


```julia
display(a)
```


    3×4 Matrix{Float64}:
     0.0242537  0.783368  0.297257  0.0832976
     0.59136    0.386452  0.380821  0.79838
     0.464914   0.708715  0.783134  0.724797


@show も似たような出力になる。REPL とそうでない場合とは少し見え方が違うかも。


```julia
@show a
```

    a = [0.024253653447755097 0.7833680829667412 0.2972569608892649 0.08329758490218564; 0.5913601626927224 0.38645181482753643 0.3808213689242702 0.798379598713088; 0.4649140344426208 0.7087146933352596 0.7831337009609467 0.7247970281267975]





    3×4 Matrix{Float64}:
     0.0242537  0.783368  0.297257  0.0832976
     0.59136    0.386452  0.380821  0.79838
     0.464914   0.708715  0.783134  0.724797



Base.print_matrix() だと，見栄えを制御できる。

- 空白区切り


```julia
Base.print_matrix(stdout, round.(a, digits=2), "", " ", "\n")
```

    0.02 0.78 0.3  0.08
    0.59 0.39 0.38 0.8
    0.46 0.71 0.78 0.72


- タブ区切り


```julia
Base.print_matrix(stdout, round.(a, digits=2), "", "\t", "\n")
```

    0.02	0.78	0.3 	0.08
    0.59	0.39	0.38	0.8
    0.46	0.71	0.78	0.72


- カンマ区切り


```julia
Base.print_matrix(stdout, round.(a, digits=2), "", ",", "\n")
```

    0.02,0.78,0.3 ,0.08
    0.59,0.39,0.38,0.8
    0.46,0.71,0.78,0.72


- 区切り文字の他に，前と後にも文字列を付けることができる


```julia
Base.print_matrix(stdout, round.(a, digits=2), "[ ", "; ", "]\n")
```

    [ 0.02; 0.78; 0.3 ; 0.08
      0.59; 0.39; 0.38; 0.8
      0.46; 0.71; 0.78; 0.72]


Base.print_array() だと以下のようになる。


```julia
Base.print_array(stdout, a)
```

     0.024253653447755097  0.7833680829667412   0.2972569608892649  0.08329758490218564
     0.5913601626927224    0.38645181482753643  0.3808213689242702  0.798379598713088
     0.4649140344426208    0.7087146933352596   0.7831337009609467  0.7247970281267975

- ファイルに書き出すときは


```julia
open("out.txt","w") do file
    Base.print_array(file, a)
end
```

readlines() 読み込んで split() 指定見ると以下のように書き込まれ・読み込まれることがわかる。


```julia
b = split.(readlines("out.txt"))
```




    3-element Vector{Vector{SubString{String}}}:
     ["0.024253653447755097", "0.7833680829667412", "0.2972569608892649", "0.08329758490218564"]
     ["0.5913601626927224", "0.38645181482753643", "0.3808213689242702", "0.798379598713088"]
     ["0.4649140344426208", "0.7087146933352596", "0.7831337009609467", "0.7247970281267975"]



行数・列数の大きい配列は，全部を出力することができないことがある。
以下の例では途中が省略されて表示される。


```julia
x = randn(50, 3);
x
```




    50×3 Matrix{Float64}:
      0.186893     1.02587    -0.0174332
     -2.38744      0.044641    1.33666
      0.756279     2.22678    -0.19134
     -0.51356      1.0953      0.117176
     -1.37625      1.18097    -1.07407
     -0.430764     0.496056    0.164412
      0.254467     1.38809    -1.09696
     -0.494301    -0.184659    0.532188
     -0.74258     -0.10339    -0.0914353
     -0.612243     0.546105    0.565877
      0.150078    -2.35916    -0.919478
     -1.27465      0.429902    0.958708
      0.0277122    0.168905   -0.602436
      ⋮                       
      0.877864     1.80436     0.279342
     -0.00288801   0.0565318   0.094282
     -0.971222    -0.681462    0.406491
     -1.08832      0.968185   -0.489051
      0.567189    -0.855057   -0.494333
      0.84778     -0.642492   -0.999687
      1.29979     -0.416949   -0.61341
     -1.90683      0.427597   -1.344
     -0.555816     0.205927    0.479885
     -0.0885263    1.04585    -0.60562
     -0.57075     -0.506791    1.59472
      0.891797     0.596023    1.01248



全部表示するようにするために，IOContext() で制限を無効にする。


```julia
io = IOContext(stdout, :limit => false)
Base.print_matrix(io, x)
```

      0.1868926525851689      1.025867519690713     -0.01743321762757181
     -2.38743868445942        0.04464096781636331    1.3366565053107193
        途中省略
     -0.5707499924411337     -0.5067909496915854     1.5947198934592173
      0.8917973854072713      0.5960230380772837     1.0124775391319727

Base.print_matrix() では，表示様式を指定することもできる。


```julia
Base.print_matrix(io, round.(x, digits=2), "", "\t", "\n")
```

     0.19	 1.03	-0.02
    -2.39	 0.04	 1.34
        途中省略
    -0.57	-0.51	 1.59
     0.89	 0.6 	 1.01



```julia
Base.print_array(io, x)
```

      0.1868926525851689      1.025867519690713     -0.01743321762757181
     -2.38743868445942        0.04464096781636331    1.3366565053107193
        途中省略
     -0.5707499924411337     -0.5067909496915854     1.5947198934592173
      0.8917973854072713      0.5960230380772837     1.0124775391319727

全行表示から元の状態（省略表示）に戻すために :limit => true を指定する。


```julia
io = IOContext(stdout, :limit => true)
Base.print_matrix(io, x)
```

      0.1868926525851689      1.025867519690713    -0.01743321762757181
     -2.38743868445942        0.04464096781636331   1.3366565053107193
      0.7562788448271573      2.2267840721929075   -0.19134032557481745
     -0.5135596333438357      1.0952979086809778    0.11717599538311974
     -1.3762523990439846      1.180971606293205    -1.0740703904829931
     -0.430763504916546       0.4960558632216056    0.1644116177438369
      0.2544673906345365      1.3880850386801602   -1.0969591907776137
     -0.4943014862653784     -0.18465859554282962   0.532188154912318
     -0.7425798993148303     -0.10339021217775117  -0.09143531829002408
     -0.612243413483382       0.5461048603509001    0.5658771237042854
      0.1500778052837083     -2.3591554543795006   -0.9194779848169511
     -1.2746536515962474      0.42990238770154016   0.9587081133315546
      0.027712186374087892    0.16890503925021177  -0.6024361730159467
      ⋮                                            
      0.8778639999695281      1.8043563996075174    0.279342348014852
     -0.0028880076477118388   0.05653183591658802   0.09428198832499617
     -0.9712223952629555     -0.6814624261845965    0.40649108846622306
     -1.088316271073857       0.9681852516250056   -0.4890514284468234
      0.5671889589989463     -0.8550571900541243   -0.4943327865546954
      0.8477802291057314     -0.6424921389531923   -0.9996866361070365
      1.299791424992038      -0.4169485009242911   -0.6134103460411193
     -1.9068348183091093      0.42759687118452083  -1.3439964813220413
     -0.5558159900104043      0.2059268250747932    0.4798849862071674
     -0.0885262829263742      1.045845748092021    -0.6056199139994978
     -0.5707499924411337     -0.5067909496915854    1.5947198934592173
      0.8917973854072713      0.5960230380772837    1.0124775391319727

データフレームの場合は，REPL では行列の場合と同じく省略して表示される。
println() を使う場合とそうでない場合の表示のされ方が違うこともある。


```julia
x = randn(50, 3);

using DataFrames
df = DataFrame(x, :auto)
println(df)
```
    [1m50×3 DataFrame[0m
    [1m Row [0m│[1m x1         [0m[1m x2          [0m[1m x3         [0m
         │[90m Float64    [0m[90m Float64     [0m[90m Float64    [0m
    ─────┼─────────────────────────────────────
       1 │  0.595143    1.5158      -0.128355
       2 │ -0.271098    0.729066     0.931596
    途中省略
      49 │  0.0683746   0.582914    -0.163188
      50 │  0.11782    -1.91213     -1.19436



Base.println() では，全行が表示される。


```julia
Base.println(df)
```

    [1m50×3 DataFrame[0m
    [1m Row [0m│[1m x1         [0m[1m x2          [0m[1m x3         [0m
         │[90m Float64    [0m[90m Float64     [0m[90m Float64    [0m
    ─────┼─────────────────────────────────────
       1 │  0.595143    1.5158      -0.128355
       2 │ -0.271098    0.729066     0.931596
    途中省略
      49 │  0.0683746   0.582914    -0.163188
      50 │  0.11782    -1.91213     -1.19436