edo1z blog

プログラミングなどに関するブログです

Numpy - 配列の形を変えるテスト

TensorFlowでは頻繁に配列の形を変換しますが、結構混乱して理解するのに時間がかかります。Numpy.reshapeとかNumpy.transposeの動きをシンプルな配列で確認してみます。

これから操作する配列は、下記のようなCifar10の画像データの構造をイメージしてます。 最初の4個は赤。次の4個は緑、最後の4個は青。 最初は上記が一次元の配列に格納されている状態にして、最終的にはこれを下記の並びにしたいです。縦、横、チャンネルの3次元配列にしたいということです。

[縦、横、チャンネル]

4個ずつ赤・緑・青があるとういことは、2x2の画像サイズになります。よって、配列のshapeは、[2, 2, 3]になることを想定しております。このshapeになりつつ、配列データの構造に不整合がなければ形の変換が成功したことになります。

コード

import numpy as np

arr = np.array([1, 2, 3, 4, 11, 12, 13, 14, 21, 22, 23, 24])

print('これだとダメ')
arr2 = arr.reshape(2, 2, 3)
print(arr2)
print('----------------------')

print('引数の順番に全体を分割していくと考えたら良さそう')
print('今は赤、緑、青の順に並んでるので、最初にチャンネル数で分けるしかない')
print('最初に全体を3つに分割して、次に2つ(縦)に分割して、最初に2つ(横)に分割する')
arr3 = arr.reshape(3, 2, 2)
print(arr3)
print('----------------------')

print('最終的に縦、横、チャンネルの順にしたいのでtransposeで順番変える')
arr4 = arr3.transpose(1, 2, 0)
print(arr4)

結果

これだとダメ
[[[ 1  2  3]
  [ 4 11 12]]

 [[13 14 21]
  [22 23 24]]]
----------------------
引数の順番に全体を分割していくと考えたら良さそう
今は赤、緑、青の順に並んでるので、最初にチャンネル数で分けるしかない
最初に全体を3つに分割して、次に2つ(縦)に分割して、最初に2つ(横)に分割する
[[[ 1  2]
  [ 3  4]]

 [[11 12]
  [13 14]]

 [[21 22]
  [23 24]]]
----------------------
最終的に縦、横、チャンネルの順にしたいのでtransposeで順番変える
[[[ 1 11 21]
  [ 2 12 22]]

 [[ 3 13 23]
  [ 4 14 24]]]