Kei Minagawa's Blog

皆川圭(@keimina)のブログ、Pythonで試したことを書いていきます

`np.broadcast_to`関数を使用して1次元配列を3次元配列に変換する

今回は、1次元配列を3次元配列に変換する方法について書きます。実装には、 `np.broadcast_to` 関数を使用しました。

1 今回、作成したい配列

どのような配列の変換をしたいかというと、変換後の配列の各要素に、変換前の要素の値がいい感じに入っている配列です。"いい感じ"が言葉では伝わらないと思いますので、作成したい配列について絵にしました。同じ色の領域は同じ値が入っています。このように、値を保ちつつ自然に1次元の配列を3次元に拡張するのが今回の目的です。

f:id:keimina:20191215135557j:plain

図1. 作成したい配列

2 作成する方法 その1

作成する方法の一つを書きます。以下の手順で変換するのが一般的かと思います。

  1. 1次元配列の一つの要素を取り出して、その取り出した値を要素とする行列を作成する
  2. 作成した行列をリストにappend
  3. 1次元配列の全ての要素について 上記(1)(2)を実行する
  4. (2)のリストが変換結果です

3 作成する方法 その2

今回の配列では、作成する方法はもう一つあります。以下の、方法です。

  1. 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 関数について書きました。

以上です。

Author: MINAGAWA KEI

Created: 2019-12-15 日 13:43

Validate