🪃

Uiua - ↯ reshape 関数

に公開

https://zenn.dev/hatappo/articles/7e4c167aa1837d

の続きでもあります。

Collection 型が配列しかない Uiua ではより複雑で高度なデータ構造を表現するには配列の仕組みのなかで工夫するしかなく、必然的に2次元配列はもちろん多次元の配列をよく使うしそれに対する操作や変換もよく行います。

その際によく使う主役級(たぶん)の関数が ↯ reshape です。

第1引数に数値か配列を、第2引数にも数値か配列を取り、配列を様々な構造に変換します。

例えば最初の引数に2を渡すと第2引数の配列を複製し2次元配列に変換します。つまり2行に変換したイメージです。

main.ua
 2 [1 2 3 4 5 6 7 8 9 10 11 12]
# ↓
╭─                            
 1 2 3 4 5 6 7 8 9 10 11 12  
  1 2 3 4 5 6 7 8 9 10 11 12  

要は  [[1 2 3 4 5 6 7 8 9 10 11 12] [1 2 3 4 5 6 7 8 9 10 11 12]] です。

第1引数を1にすると、1行になるので、結果変化しません。

main.ua
 1 [1 2 3 4 5 6 7 8 9 10 11 12]
# ↓
╭─                            
 1 2 3 4 5 6 7 8 9 10 11 12  

0なら0行になり、空の配列になります。

main.ua
 0 [1 2 3 4 5 6 7 8 9 10 11 12]
# ↓
╭─   
    

第1引数をに要素数2の配列を渡すと2次元配列に変換します。
2行6列に変換

main.ua
 2_6 [1 2 3 4 5 6 7 8 9 10 11 12]
# ↓
╭─                
 1 2 3  4  5  6  
  7 8 9 10 11 12  

4行3列に変換

main.ua
 4_3 [1 2 3 4 5 6 7 8 9 10 11 12]
# ↓
╭─          
  1  2  3  
   4  5  6  
   7  8  9  
  10 11 12  

3行2列に変換。余った要素数は捨てられる。ここでは 7~12は捨てられる。

main.ua
 3_2 [1 2 3 4 5 6 7 8 9 10 11 12]
# ↓
 1 2  
  3 4  
  5 6  

5行4列。足りない分は、元の配列を先頭から繰り返して補填される。

main.ua
 5_4 [1 2 3 4 5 6 7 8 9 10 11 12]
# ↓
╭─            
 1  2  3  4  
  5  6  7  8  
  9 10 11 12  
  1  2  3  4  
  5  6  7  8  

もともと3行2列のものを3行2列に変換しても何も変わらない。

main.ua
 3_2 [1_2 3_4 5_6]
# ↓
╭─     
 1 2  
  3 4  
  5 6  

▽ keep は似ているけど次元を増加させてないところが異なる。

main.ua
 3 [1 2 3]
 3 [1 2 3]
# ↓
╭─       
 1 2 3  
  1 2 3  
  1 2 3  

[1 2 3 1 2 3 1 2 3]
main.ua
 3 [1_2_3]
 3 [1_2_3]
# ↓
╭─       
 1 2 3  
        
  1 2 3  
         
  1 2 3  

╭─       
 1 2 3  
  1 2 3  
  1 2 3  

Discussion