今回は、1次元配列を3次元配列に変換する方法について書きます。実装には、 `np.broadcast_to` 関数を使用しました。
Table of Contents
1 今回、作成したい配列
どのような配列の変換をしたいかというと、変換後の配列の各要素に、変換前の要素の値がいい感じに入っている配列です。"いい感じ"が言葉では伝わらないと思いますので、作成したい配列について絵にしました。同じ色の領域は同じ値が入っています。このように、値を保ちつつ自然に1次元の配列を3次元に拡張するのが今回の目的です。
2 作成する方法 その1
作成する方法の一つを書きます。以下の手順で変換するのが一般的かと思います。
- 1次元配列の一つの要素を取り出して、その取り出した値を要素とする行列を作成する
- 作成した行列をリストにappend
- 1次元配列の全ての要素について 上記(1)(2)を実行する
- (2)のリストが変換結果です
3 作成する方法 その2
今回の配列では、作成する方法はもう一つあります。以下の、方法です。
- np.broadcast_to 関数を使用する
今回は、こちらで実装します。もちろん、作成する方法 その1 を、そのまま Python で実装しても良いです(むしろそっちの方が可読性が良いかも)。
4 コード
コードは以下の通りです。
# -*-coding:utf-8 -*- import numpy as np M, N = 4, 4 # 入力 arr1d = np.array([1, 2, 3, 4]) # 出力 arr3d = np.broadcast_to(arr1d[:,np.newaxis,np.newaxis], (arr1d.shape[0], M, N)) print(arr3d)
5 出力結果
出力結果は以下の通りです。arr3d[0] が値が1の要素からなる行列になっています。arr3d[1], arr3d[2], arr3d[3] も同様です。意図した配列が作成されていることがわかります。
array([[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]], [[3, 3, 3, 3], [3, 3, 3, 3], [3, 3, 3, 3], [3, 3, 3, 3]], [[4, 4, 4, 4], [4, 4, 4, 4], [4, 4, 4, 4], [4, 4, 4, 4]]])
6 コードの説明
`np.broadcast_to` 関数の第1引数に与えている `arr1d[:,np.newaxis,np.newaxis]` ですが、これは arr1d を配列を要素数をそのままに次元数を3次元にを増やした配列を表しています。np.newaxis は None で定義されていますが、このように使用すると、配列に新しい軸を与え、次元を増やすことができます。第2引数は、変換したい配列の shape を与えています。
7 まとめ
1次元配列を3次元配列に変換する方法、np.broadcast_to 関数について書きました。
以上です。
Created: 2019-12-15 日 13:43