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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

Q&A

解決済

3回答

790閲覧

numpy二次元配列(画像)を順番に読み込み、numpy三次元配列にする

fy_2000

総合スコア20

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

0グッド

1クリップ

投稿2018/04/21 04:41

編集2018/04/21 05:20

前提・実現したいこと

numpy配列の2次元画像を順番に読み込み、3次元目の方向に加えたい。
(イメージとしては画像がシート上に複数枚重なっているような感じです。)
python初心者です。教えていただけると嬉しいです。
よろしくお願いいたします。

試したこと

np.append()
np.flatten()にしてから、配列を3次元にするといった方法
を試しましたがどうもうまく行きませんでした。
np.vstackの方法を教えていただいたのですが、二次元画像がそのまま前の画像の配列の続きに足されてしまい、どこが画像と画像の境かがわからない状況です。なのでこの方法ではだめなのかもしれません。

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

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

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

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

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

guest

回答3

0

ベストアンサー

2次元→3次元はdstackでできますね。

python

1>>> a = np.array([[1,2],[3,4]]) 2>>> b = np.array([[5,6],[7,8]]) 3>>> np.dstack([a,b]) 4array([[[1, 5], 5 [2, 6]], 6 7 [[3, 7], 8 [4, 8]]])

dstackはいまいち直感的ではないので、いっそこれでも良い気が。

python

1>>> np.array([a,b]) 2array([[[1, 2], 3 [3, 4]], 4 5 [[5, 6], 6 [7, 8]]])

追記

追加で重ねる方法について色々試してみたので、参考にどうぞ。

python

1>>> import numpy as np 2>>> a = np.array([[1,2],[3,4]]) 3>>> b = np.array([[5,6],[7,8]]) 4>>> c = np.array([[9,10],[11,12]]) 5>>> d = np.dstack([a,b]) 6>>> np.dstack([d,c]) # dstackで作った3次元配列に新たな2次元配列を結合 7array([[[ 1, 5, 9], 8 [ 2, 6, 10]], 9 10 [[ 3, 7, 11], 11 [ 4, 8, 12]]]) 12>>> np.dstack([d,c,c,d]) # こんなのでも上手く行った 13array([[[ 1, 5, 9, 9, 1, 5], 14 [ 2, 6, 10, 10, 2, 6]], 15 16 [[ 3, 7, 11, 11, 3, 7], 17 [ 4, 8, 12, 12, 4, 8]]]) 18>>> e = np.array([a,b]) 19>>> e 20array([[[1, 2], 21 [3, 4]], 22 23 [[5, 6], 24 [7, 8]]]) 25>>> np.concatenate([e, [c]], axis=0) # 二番目の方法でやるならこうなると思う 26array([[[ 1, 2], 27 [ 3, 4]], 28 29 [[ 5, 6], 30 [ 7, 8]], 31 32 [[ 9, 10], 33 [11, 12]]])

投稿2018/04/21 05:47

編集2018/04/21 08:19
hayataka2049

総合スコア30933

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

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

fy_2000

2018/04/21 08:06

回答ありがとうございます。 一発で2次元→3次元にする方法を考えていたので、この方法はとてもわかり易いです。a,bをdstackした後にさらに他の2次元配列をここにdstackすると同様にうまく加わるかを試してみたいと思います。
hayataka2049

2018/04/21 08:18 編集

追加についても試したので、回答の方に追記しました
fy_2000

2018/04/21 09:10

np.concatenate([e, [c]], axis=0) このような配列を作るのをイメージしていました。 ありがとうございます!
fy_2000

2018/04/21 16:02

ただ、2次元配列を順番に読み込んでいくという関係から、ループの1回目では (a,b,cは2次元配列) d = np.array[a,b]として ループの2回め以降は e = np.concatenate([d, [c]], axis=0) とする必要があります。 もしご存知でしたら1回めから同じ方法を用いるやりかたを教えていただけないでしょうか。
hayataka2049

2018/04/21 16:22

空リストにappendしていって、ループを抜けてからnumpy配列に変換するのがいちばん楽です ただし瞬間的に全データの倍のメモリ消費がある(はず)なので、気を使う必要があります あとは、データ数がわかっているなら、先に全データ分の配列を作ってしまって、in-placeで代入していくのも一つの手かな、と思ったり
fy_2000

2018/04/23 03:59

なるほど。このような方法もあるのですね。 メモリに注意を払うという必要もあるのですね。 何度もお答えいただき、ありがとうございます。
guest

0

np.vstackを使ってみてください。


こういうやつです。

python

1import numpy as np 2 3a = np.array([[[1,2],[3,4]]]) 4c = np.vstack((a, a)) 5 6for _ in range(3): 7 c = np.vstack((c, a)) 8print(c)

投稿2018/04/21 04:44

編集2018/04/21 06:12
mkgrei

総合スコア8560

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

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

fy_2000

2018/04/21 04:50

確認してみます。 ありがとうございます。
fy_2000

2018/04/21 08:04

ありがとうございます。イメージとしては2次元画像を足しあわせて3次元の配列にするというものだったので、最初から3次元の配列を作っておくというやり方は考えていませんでした。勉強になりました。 丁寧にありがとうございます。
fy_2000

2018/04/21 16:03 編集

投稿を間違えました。すみません。
guest

0

np.flatten()にしてから、配列を3次元にするといった方法を試しましたがどうもうまく行きませんでした。

うまくいかないままだと気持ち悪くないでしょうか?自分はappendもvstackもわかってなかったのでやってみました。

2次元のデータの先頭に次元を追加しておいて、追加する配列もappendの度に先頭に次元を追加しaxis=0を指定して随時追加という感じにすれば期待通りのことができるみたいです。vstackは引数の与え方がappendと違いtupleにする点と、axis=0が前提であるといったあたりでしょうか・・・

python

1img1 = img2 = img3 = np.zeros((2,2)) 2# 0次元目を追加しておく。 3stack = img1[None, ...] 4print(stack.shape) # (1, 2, 2) 5 6# 追加する配列も0次元目を追加した上でappend(またはvstack)する 7 8stack = np.append(stack, img2[None, ...], axis=0) 9stack = np.vstack(stack, img3[None, ...]) 10 11print(stack.shape) # (3, 2, 2)

img[None, ...]は次元を追加する書き方の一つでimg.reshape((1,) + img.shape)と同様の結果が得られます。
追加する次元のところをNoneと指定してそれ以外をオリジナルと同じ形としたいときEllipsis(...)で表現できるので割と直感的かと思います。

また、オリジナルのshapeを覚えておいて、各配列をflatten()しながら随時一次元データとしてappendし、最後にreshapeしてもよいと思います。

Python

1image_shape = img1.shape 2 3stack = img1.flatten() 4stack = np.append(stack, img2.flatten()) 5stack = np.append(stack, img3.flatten()) 6 7stack = np.reshape((-1,) + image_shape) 8print(stack.shape) # (3, 2, 2)

ただ全ての配列が予め全部用意できるならhayataka2049さん回答にある

np.array([img1, img2, img3])

が一番直感的で簡潔だと思います。

投稿2018/04/21 07:23

KSwordOfHaste

総合スコア18394

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

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

fy_2000

2018/04/21 08:11

回答ありがとうございます。 とても丁寧に初心者の私に解説していただき、とてもわかりやすかったです。(そして勉強になりました。) 全ての配列を最初には用意できないので(順番にデータから読み込んでいきたい)、上側に記入していただいた書き方が自分には合っているのではないかと思います。 試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問