質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4561閲覧

3次元配列同士の結合について

Fallout_18

総合スコア124

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/29 15:03

編集2018/09/29 15:05

以下のモデルを2次元配列の結合みたく、3次元配列を立体的に合体させたいのですが、上手いやり方があるのか教えて欲しいです。
イメージ説明
上の3次元配列から、以下の図を生成しようとしています。
イメージ説明

python

1import numpy as np 2######### 3stage1 = np.array([[[1,1,1], 4 [1,0,1], 5 [1,1,1]], 6 [[1,0,1], 7 [0,0,0], 8 [1,0,1]], 9 [[1,1,1], 10 [1,0,1], 11 [1,1,1]]],dtype="float") 12empty = np.zeros([3,3,3]) 13########## 14yoko_01 = np.vstack([stage1,stage1,stage1]) 15yoko_02 = np.vstack([stage1,empty, stage1]) 16yoko_11 = np.vstack([empty,empty,empty]) 17######### 18stage2 = np.array([np.hstack([yoko_01,yoko_02,yoko_01]),np.hstack([yoko_02,yoko_11,yoko_02]),np.hstack([yoko_01,yoko_02,yoko_01]) ])

見た感じ違う気がするのですが、調べたところ3次元配列を2次元配列みたく(イメージとして平行に合体)できないみたいなのですが、
じぶんの解決策としてxで場合分けして考えるしかないのでしょうか?それだとできると思うのですが、少し面倒くさいやり方だと思ったので、もう少しスマートにできる方がいらっしゃいましたら、教えてください。

宜しくお願い致します。

(追記)
stage i にstage1を入れています。ここでの0はstage1と同じ配列の数をもった0という意味です

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/09/29 15:44 編集

説明がよくわかりません。結合前、結合後の配列のshapeと具体例があるとわかりやすいと思います
morinatsu

2018/09/29 16:01

同じく、「2次元配列みたく」「並行に合体」の時点で分かりません。
Fallout_18

2018/09/29 16:04

すいません。書き直します
guest

回答1

0

ベストアンサー

numpy なので、x = axis0, y = axis1, z = axis2 と仮定して話を進めますね。
(3, 3, 3) の numpy 配列を +z (axis=2),+y (axis=1) 方向に順に結合していき、(3, 9, 9) の配列を作りたいと解釈したので、以下にサンプルコードを書きます。
意図と違ったらすいません。

サンプルコード

結合するブロックを作成する。

import numpy as np stage1 = np.array([[[1,1,1], [1,0,1], [1,1,1]], [[1,0,1], [0,0,0], [1,0,1]], [[1,1,1], [1,0,1], [1,1,1]]]) empty = np.zeros([3,3,3]) print('stage1.shape', stage1.shape) # stage1.shape (3, 3, 3) print('empty.shape', empty.shape) # empty.shape (3, 3, 3)

numpy.block(arrays) を使うと、複数の numpy 配列を並べて結合できます。

python

1block = np.block([[stage1, stage1, stage1], 2 [stage1, empty, stage1], 3 [stage1, stage1, stage1]]) 4print(block.shape) # array.shape (3, 9, 9)
array [[[1. 1. 1. 1. 1. 1. 1. 1. 1.] [1. 0. 1. 1. 0. 1. 1. 0. 1.] [1. 1. 1. 1. 1. 1. 1. 1. 1.] [1. 1. 1. 0. 0. 0. 1. 1. 1.] [1. 0. 1. 0. 0. 0. 1. 0. 1.] [1. 1. 1. 0. 0. 0. 1. 1. 1.] [1. 1. 1. 1. 1. 1. 1. 1. 1.] [1. 0. 1. 1. 0. 1. 1. 0. 1.] [1. 1. 1. 1. 1. 1. 1. 1. 1.]] [[1. 0. 1. 1. 0. 1. 1. 0. 1.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 1. 1. 0. 1. 1. 0. 1.] [1. 0. 1. 0. 0. 0. 1. 0. 1.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 1. 0. 0. 0. 1. 0. 1.] [1. 0. 1. 1. 0. 1. 1. 0. 1.] [0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 1. 1. 0. 1. 1. 0. 1.]] [[1. 1. 1. 1. 1. 1. 1. 1. 1.] [1. 0. 1. 1. 0. 1. 1. 0. 1.] [1. 1. 1. 1. 1. 1. 1. 1. 1.] [1. 1. 1. 0. 0. 0. 1. 1. 1.] [1. 0. 1. 0. 0. 0. 1. 0. 1.] [1. 1. 1. 0. 0. 0. 1. 1. 1.] [1. 1. 1. 1. 1. 1. 1. 1. 1.] [1. 0. 1. 1. 0. 1. 1. 0. 1.] [1. 1. 1. 1. 1. 1. 1. 1. 1.]]]

numpy.block() の仕組み

説明の要約

arrays の最も内側のリストを axis=-1 で結合し、結合してできた配列のリストを axis=-2 で結合する。これを arrays の最も外側の要素に到達するまで繰り返す。

今回の例の場合、
arrays 引数の最も内側のリストは、次の3つになるので、これをそれぞれ axis=-1 方向に結合します。

[stage1, stage1, stage1] [stage1, empty, stage1] [stage1, stage1, stage1]
# axis=-1 つまり axis=2 方向に結合 row1 = np.concatenate([stage1, stage1, stage1], axis=-1) row2 = np.concatenate([stage1, empty, stage1], axis=-1) row3 = np.concatenate([stage1, stage1, stage1], axis=-1) print('row1.shape', row1.shape) # row1.shape (3, 3, 9) print('row2.shape', row2.shape) # row2.shape (3, 3, 9) print('row3.shape', row3.shape) # row3.shape (3, 3, 9)

こうしてできた row1, row2, row3 を axis=-1 方向に結合します。

# axis=-2 つまり axis=1 方向に結合 array = np.concatenate([row1, row2, row3], axis=-2) print('array.shape', array.shape) # array.shape (3, 9, 9)

これ以上結合する配列はないので、処理はストップします。

投稿2018/09/30 05:37

編集2018/09/30 05:40
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Fallout_18

2018/10/02 04:31

numpy.blockをつかうのですね!! この存在を知りませんでした!! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問