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

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

ただいまの
回答率

90.48%

  • Python

    8573questions

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

  • Python 2.7

    1308questions

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

  • NumPy

    475questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 613

fy_2000

score 8

 前提・実現したいこと

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

 試したこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

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

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

       [[3, 7],
        [4, 8]]])


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

>>> np.array([a,b])
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])

 追記

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

>>> import numpy as np
>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6],[7,8]])
>>> c = np.array([[9,10],[11,12]])
>>> d = np.dstack([a,b])
>>> np.dstack([d,c]) # dstackで作った3次元配列に新たな2次元配列を結合
array([[[ 1,  5,  9],
        [ 2,  6, 10]],

       [[ 3,  7, 11],
        [ 4,  8, 12]]])
>>> np.dstack([d,c,c,d]) # こんなのでも上手く行った
array([[[ 1,  5,  9,  9,  1,  5],
        [ 2,  6, 10, 10,  2,  6]],

       [[ 3,  7, 11, 11,  3,  7],
        [ 4,  8, 12, 12,  4,  8]]])
>>> e = np.array([a,b])
>>> e
array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])
>>> np.concatenate([e, [c]], axis=0) # 二番目の方法でやるならこうなると思う
array([[[ 1,  2],
        [ 3,  4]],

       [[ 5,  6],
        [ 7,  8]],

       [[ 9, 10],
        [11, 12]]])

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 17:06

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

    キャンセル

  • 2018/04/21 17:16 編集

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

    キャンセル

  • 2018/04/21 18:10

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

    キャンセル

  • 2018/04/22 01:02

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

    キャンセル

  • 2018/04/22 01:22

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

    キャンセル

  • 2018/04/23 12:59

    なるほど。このような方法もあるのですね。
    メモリに注意を払うという必要もあるのですね。

    何度もお答えいただき、ありがとうございます。

    キャンセル

+3

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


こういうやつです。

import numpy as np

a = np.array([[[1,2],[3,4]]])
c = np.vstack((a, a))

for _ in range(3):
    c = np.vstack((c, a))
print(c)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 13:50

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

    キャンセル

  • 2018/04/21 17:04

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

    キャンセル

  • 2018/04/22 00:59 編集

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

    キャンセル

+1

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

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

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

img1 = img2 = img3 = np.zeros((2,2))
# 0次元目を追加しておく。
stack = img1[None, ...]
print(stack.shape)           # (1, 2, 2)

# 追加する配列も0次元目を追加した上でappend(またはvstack)する

stack = np.append(stack, img2[None, ...], axis=0)
stack = np.vstack(stack, img3[None, ...])

print(stack.shape)           # (3, 2, 2)

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

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

image_shape = img1.shape

stack = img1.flatten()
stack = np.append(stack, img2.flatten())
stack = np.append(stack, img3.flatten())

stack = np.reshape((-1,) + image_shape)
print(stack.shape)           # (3, 2, 2)

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/21 17:11

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

    キャンセル

関連した質問

  • 解決済

    ndarrayのソートについて

    numpyのarray [[1, 2]  [6, 5]  [3, 8]] を以下のようにソートすると a = numpy.array([[1,2],[6,5],[3,8]]) a.

  • 解決済

    dotとmultiplyの違い

    Cosine類似度をnumpyで表現したいです。 正解が以下のコードだそうです。 norm = np.linalg.norm(train_X, ord=2, a

  • 解決済

    numpyのdeleteについて

    numpy配列を範囲指定して削除したいのですが方法がわからず困っています。 numpy.delete(arr, obj, axis=0) 以上のコマンドを使って、ある範

  • 解決済

    【python】numpyがインポートできない

    ■質問内容 Anacondaをインストールし,pythonでnumpyをインポートしたのですが,下記エラーが表示され,下名では解決できません。解決のためアドバイスをお願い致します。

  • 解決済

    arrayとndarrayの違い

    質問内容 arrayとndarrayは具体的にどのような違いがあるんでしょうか?

  • 解決済

    nanの入れ替えをしたい

    python3で、配列内に計算上発生したnanを0で入れ替えるプログラムを書きたいと思っているのですが、入れ替えができません。 for i in range(0,10)

  • 解決済

    Numpy配列をC#で扱う方法

    質問内容 pythonでnumpy.ndarray型を返す関数をつくり、その配列(二次元配列)をC#で扱う方法があるか探しております。 そもそも実現可能なのでしょうか? なにも

  • 解決済

    jupyter notebookでsklearn.datasetsのimportが出来ない。

    前提・実現したいこと 初めて質問させていただきます。よろしくお願いいたします。 jupyter notebookを利用して、sklearn.datasetsのデータを分析しようとし

同じタグがついた質問を見る

  • Python

    8573questions

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

  • Python 2.7

    1308questions

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

  • NumPy

    475questions

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