39234


下記の関数は画像をマージさせる処理なんですが、

[code]

    img[j*h:j*h+h, i*w:i*w+w, :] = image
    
[/code]

のコードはどのように配列計算しているんでしょうか。

[code]

    def merge(images, size):
      h, w = images.shape[1], images.shape[2]
      img = np.zeros((h*size[0], w*size[1], 1))
      for idx, image in enumerate(images):
        i = idx % size[1]
        j = idx // size[1]
        img[j*h:j*h+h, i*w:i*w+w, :] = image
    
      return img
    
[/code]


CC BY-SA 3.0
2017-11-01T13:08:11.583
39219
2017-11-02T06:00:20.613
2017-11-02T06:00:20.613
19110
26014
question
python tensorflow
どのように配列計算されているのか分からない


プログラムを1行ずつ解説すると煩雑そうなので、ざっくりとしたイメージとして説明します。

まず、引数の `images` は、高さ `h`、幅 `w` の画像たちを一列に並べた配列です。

[![images
の内容の概略図](https://i.stack.imgur.com/Q3xIl.png)](https://i.stack.imgur.com/Q3xIl.png)

`merge` 関数は、この一列に並んだ画像たちを、縦 `size[0]` 個、横 `size[1]`
個となるように並べ替えます。タイルを張り替えるような感覚です。

[![img
の内容の概略図](https://i.stack.imgur.com/Nielq.png)](https://i.stack.imgur.com/Nielq.png)

ご指摘の

[code]

    img[j*h:j*h+h, i*w:i*w+w, :] = image
    
[/code]

という部分では、タイル1枚を `img` に貼ることをしています。つまり、タイルとして見ると縦 `j` 番目、横 `i` 番目の領域に `image`
をコピーしています。各 `image` は高さ `h`、幅 `w` なので、`img` の座標で言うと縦 `j*h` から `(j+1)*h`、横
`i*w` から `(i+1)*w` の部分に代入することになります。


CC BY-SA 3.0
2017-11-02T02:32:30.580
39234
2017-11-02T05:59:00.673
2017-11-02T05:59:00.673
19110
19110
39219
answer