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

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

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

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

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

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

Q&A

解決済

2回答

378閲覧

python3にて 2次元配列の置換

haruohmi

総合スコア10

多次元配列

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

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

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

0グッド

0クリップ

投稿2020/01/17 01:19

編集2020/01/17 02:47

「画像、画像上の2点の座標、そして色が指定されているとき、その2点を結ぶ指定された色の直線を画像に書き加える関数を作れ。座標はy座標・x座標の順に入力するものとする。以下は実行例である。頂点としては(2,0)と(3,2)を指定している。」という問題です。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 6ex5_6(image, 0, 2, 2, 3, 0.5)(return) 7 8image(return) 9 10image = [[0, 0, 0.5, 0, 0], 11 [0, 0, 0.5, 0, 0], 12 [0, 0, 0, 0.5, 0], 13 [0, 0, 0, 0, 0]] 14

このような操作もできないのはお恥ずかしい次第です。次のようにプログラムしましたが間違っているのは明らかながら、どのようにすればいいのか思いつきません。お教えください。コードはnumpyなどを使わず、愚直に基本的な書き方で書きたいと思っています。

python3

1 2def ex5_6(image, y1, x1, y2, x2, color): 3 for i in range(len(image)): 4 for j in range(len(image[i])): 5 if y1<= i <= y2 and x1 <= j <= x2: 6 if j%2 == 1: 7 j = j-1 8 image[i][j] = color 9

上記のコードの結果は次です。

python3

1 2[[0, 0, 0.5, 0, 0], [0, 0, 0.5, 0, 0], [0, 0, 0.5, 0, 0], [0, 0, 0, 0, 0]] 3

ほしい結果は次です。

python3

1image = [[0, 0, 0.5, 0, 0], 2 [0, 0, 0.5, 0, 0], 3 [0, 0, 0, 0.5, 0], 4 [0, 0, 0, 0, 0]]

これを画像化

python3

1 2ita.plot.image_show(image)

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

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

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

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

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

shiracamus

2020/01/17 02:09

最終的に欲しい結果データを示していただけますか?
haruohmi

2020/01/17 02:27

最終的にほしい結果は、 image = [[0, 0, 0.5, 0, 0], [0, 0, 0.5, 0, 0], [0, 0, 0, 0.5, 0], [0, 0, 0, 0, 0]] です。これを、 ita.plot.image_show(image) で画像化したいと思っています。
shiracamus

2020/01/17 02:31

質問欄に追記して、皆さんにも見てもらいましょう。
guest

回答2

0

ベストアンサー

データを作るだけですが、こんな処理でいけるかな?
縦方向と横方向の差分の長い方を座標移動ステップ数に選んで、1ステップずつ座標を求めながら color を格納。
+ 0.5 して四捨五入計算。

python

1def ex5_6(image, y1, x1, y2, x2, color): 2 dy = y2 - y1 3 dx = x2 - x1 4 step = max(abs(dy), abs(dx)) 5 for i in range(step + 1): 6 sy = y1 + int((dy * i + 0.5) // step) 7 sx = x1 + int((dx * i + 0.5) // step) 8 image[sy][sx] = color 9 10image = [[0, 0, 0, 0, 0], 11 [0, 0, 0, 0, 0], 12 [0, 0, 0, 0, 0], 13 [0, 0, 0, 0, 0]] 14 15ex5_6(image, 0, 2, 2, 3, 0.5) 16print(image)

投稿2020/01/17 03:13

編集2020/01/17 03:20
shiracamus

総合スコア5406

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

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

haruohmi

2020/01/17 07:29

ありがとうございました。今使っているテキストが森畑明昌『Pythonによるプログラミング入門』東大出版会というもので、解説は基本的なところを大づかみにしてあり、練習問題で突如前提知識が必要なものをそれの解説なしに出題されるということになっています。大学のテキストで先生の説明を伴いながらなら、なんとかなるでしょうが、独学でやっていますので、なかなか難しいです。この問題は1週間くらい考えていたのですがだめでした。ありがとうございました。
shiracamus

2020/01/17 07:39

私の独学方法は、公式のPythonチュートリアルをやったあと、The Python Challenge に挑戦して途中までしか解けずインターネットで解法を探して理解し、次に CheckIO で問題を解いて、他人の回答と比較して、なぜその書き方で動作するのかステップ実行しながら動作確認しまくりました。 ゲーム感覚で学べて楽しかったです。 参考: https://docs.python.org/ja/3.6/tutorial/ http://www.pythonchallenge.com/ https://checkio.org/
haruohmi

2020/01/18 00:20

ご教示ありがとうございます。深謝。
guest

0

線を引くのは簡単そうに思えて、以外と難しいですよ。
いくつかアルゴリズムがありますが、有名なものだと ブレゼンハムのアルゴリズム があります。

「ブレゼンハムのアルゴリズム」で検索すると、コードや解説が出てくると思うので、詳細はそちらを参照ください。

以下、このサイト から持ってきたコードで試した結果です。

python

1def bresenham(x1, y1, x2, y2): 2 # x1 < x2, y1 < y2 となるようにする。 3 x1, x2 = sorted([x1, x2]) 4 y1, y2 = sorted([y1, y2]) 5 # (x1, y1) と (x2, y2) を結ぶ点一覧 6 points = [] 7 8 m = 2 * (y2 - y1) 9 slope_error = m - (x2 - x1) 10 y = y1 11 for x in range(x1, x2 + 1): 12 slope_error += m 13 if slope_error >= 0: 14 y += 1 15 slope_error -= 2 * (x2 - x1) 16 17 points.append([x, y]) 18 19 return points 20 21 22# 白紙の画像を作成する。 23img = np.full((100, 100, 3), 255, dtype=np.uint8) 24 25# 点が通るピクセル一覧を計算する。 26x1, y1 = 80, 50 27x2, y2 = 10, 10 28 29# 点を計算する。 30points = bresenham(x1, y1, x2, y2) 31for x, y in points: 32 img[y, x] = [255, 0, 0] # 赤 33 34fig, ax = plt.subplots() 35ax.imshow(img) 36plt.show()

類似の過去質問として以下があります。

投稿2020/01/17 01:57

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問