前提・実現したいこと
numpy配列の2次元画像を順番に読み込み、3次元目の方向に加えたい。
(イメージとしては画像がシート上に複数枚重なっているような感じです。)
python初心者です。教えていただけると嬉しいです。
よろしくお願いいたします。
試したこと
np.append()
np.flatten()にしてから、配列を3次元にするといった方法
を試しましたがどうもうまく行きませんでした。
np.vstackの方法を教えていただいたのですが、二次元画像がそのまま前の画像の配列の続きに足されてしまい、どこが画像と画像の境かがわからない状況です。なのでこの方法ではだめなのかもしれません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア30933
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総合スコア8560
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
総合スコア18392
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/21 08:06
2018/04/21 08:18 編集
2018/04/21 09:10
2018/04/21 16:02
2018/04/21 16:22
2018/04/23 03:59