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

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

新規登録して質問してみよう
ただいま回答率
85.47%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python 3.x

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

Q&A

解決済

2回答

849閲覧

二次元配列の一部を置換してそれを元に画像を描く時に、内包表記を使用して新たに作った配列が反映されない問題

haruohmi

総合スコア10

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python 3.x

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

0グッド

0クリップ

投稿2020/01/08 02:47

「画像、画像上の2点の座標、そして色が指定されているとき、その2点を対角頂点とし、各辺はx軸ないしy軸に平行であり、指定された色の長方形を画像に書き加える関数ex5_5を作れ。頂点としては(2,0)と(3,2)を指定している。」という問題です。次が実行例です。

python3

1image = [[0, 0, 0, 0, 0], 2 [0, 0, 0, 0, 0], 3 [0, 0, 0, 0, 0], 4 [0, 0, 0, 0, 0]](return) 5 6ex5_5(image, 0, 2, 2, 3, 0.5)(return) 7 8image(return) 9 10[[0, 0, 0.5, 0.5, 0], 11[0, 0, 0.5, 0.5, 0], 12[0, 0, 0.5, 0.5, 0], 13[0, 0, 0, 0, 0]]

次のようにプログラムを書きました。jupyter notebookを使いました。

python3

1image = [[0, 0, 0, 0, 0], 2 [0, 0, 0, 0, 0], 3 [0, 0, 0, 0, 0], 4 [0, 0, 0, 0, 0]](return) 5 6def ex5_5(image, y1, x1, y2, x2, color): 7 image = [[0.5 if x1 <= i <= x2 else 0 for i in range(0, 5)] for j in         range(0, 4) if y1 <= j <= y2] 8 return image(return) 9 10ex5_5(image, 0, 2, 2, 3, 0.5)(return) 11 12[[0, 0, 0.5, 0.5, 0], [0, 0, 0.5, 0.5, 0], [0, 0, 0.5, 0.5, 0]] 13 14 15image(return) 16 17[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] 18 19 20ita.plot.image_show(image)(return) 21 22 23

もちろん最終行の結果は真っ黒の四角だけで、グレーの小さな長方形は上書きされません。上記のコードや結果はどこがおかしいのでしょうか。内包表記でリストを書き換えた後になぜ元のリストが出てくるのでしょうか。お教えください。お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

オブジェクトの内容を入れ替えるように書けば反映されます。

python

1image = [[0, 0, 0, 0, 0], 2 [0, 0, 0, 0, 0], 3 [0, 0, 0, 0, 0], 4 [0, 0, 0, 0, 0]] 5 6def ex5_5(image, y1, x1, y2, x2, color): 7 image[y1:y2+1] = [[0.5 if x1 <= x <= x2 else 0 for x in range(0, 5)] 8 for y in range(y1, y2 + 1)] 9 10ex5_5(image, 0, 2, 2, 3, 0.5) 11print(image)

投稿2020/01/08 04:03

編集2020/01/08 07:06
shiracamus

総合スコア5406

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

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

haruohmi

2020/01/08 05:54

ありがとうございました。
haruohmi

2020/01/08 06:25

上記のコードの中で関数を呼び出して、imageを確認すると、リストの最後の要素の[0, 0, 0, 0, 0]が出てこないのですが、これはどのようにして回避すればよいのでしょうか。
shiracamus

2020/01/08 06:56

if y1 <= j <= y2 で該当しない行を捨てているからでしょう。 y1〜y2の範囲を置き換えるように回答欄のコードを対応しました。
haruohmi

2020/01/09 00:40

ありがとうございました。
guest

0

リスト内包表記は「結果のリストを新しく作る」操作です。また、関数ex5_5の中でimageに対して行っている代入ですが、ここでimageはローカル変数になりますから、関数外の変数に波及したりはしません。

in-placeで処理したい場合、引数として受け取ったlistの要素に対して代入を行います。愚直に実装するとこんな感じでしょうか。

python

1def ex5_5(image, y1, x1, y2, x2, color): 2 for i in range(len(image)): 3 for j in range(len(image[i])): 4 if y1 <= i <= y2 and x1 <= j <= x2: 5 image[i][j] = color

投稿2020/01/08 03:51

hayataka2049

総合スコア30933

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

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

haruohmi

2020/01/08 05:54

なるほど、納得しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問