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

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

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

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

Q&A

解決済

1回答

729閲覧

for分を用いてlistの数値を置換したい

secondson

総合スコア21

Python

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

0グッド

0クリップ

投稿2019/05/07 08:45

任意の数値に対して、各数値に対応した(r,g,b)の値を代入し再画像化したいのですが、「KeyError: '8'」とエラーが表示されてしまい難航してしまいました。

今回のコードは、klistの数値に対して並んでいる順番ごと(今回は8が1番目、2が2番目、、、といった順番です。)にrgbの値を対応させて、それを用いてcdの60000個の数値を一気に変換することを目指しています。

python

1h,w,c = img.shape #(200,300,3) 2 3klist=[8, 2, 3, 1, 9, 5, 4, 0, 7, 6] #0~9の数値がランダムに並ぶlistです。 4 5mydict={0:(255,0,0),1:(0,255,0),2:(0,0,255),3:(255,255,0),4:(255,0,255),5:(0,255,255),6:(100,100,100),7:(100,100,0),8:(100,0,100),9:(0,100,100)} 6 7cd=8,5,3,7,4,7,8,5,4,3,1,4,7........8,6,9 #60000個の0~9の数値が並んでます。 8 9for x in cd: 10 klist[x]=mydict[x] 11 12pixels = cd.reshape(h,w) 13plt.imshow(pixels) 14plt.show()

途中経過として、
klist[0]=8 → (255,0,0)
klist[1]=2 → (0,255,0)
klist[2]=3 → (0,0,255)
・・・・・・・・・
klist[9]=6 → (0,100,100)
のように置換して、

上記の各数値の対応関係を活用した結果として、
cd=[(255,0,0),(0,255,255),(0,0,255).......(0,100,100),(255,0,255)]
のような出力を用いて、最終的に300×200画素の元画像のサイズに戻したいと考えています。

pythonの初心者であるため見苦しい箇所ばかりであると思いますが、ご教授頂けたら幸いです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「KeyError: '8'」とエラーが表示されてしまい難航してしまいました。

cdの中にstr型の'8'が含まれていませんか?
以下のようなコードで、どの位置にstr型の要素があるか確認できます。

Python

1cd=8,5,3,7,4,7,8,5,4,3,1,4,7........8,6,9 #60000個の0~9の数値が並んでます。 2for i,x in enumerate(cd): 3 if type(x) == str: 4 print('index=',i,'x=',x,'is str!') # たとえば「index= 1 x= 8 is str!」など

コメントを受けて

変数cdはカンマ区切りの文字列のようなので、まずは数値リストに変換してやる必要があります。
その後やりたい処理としては以下のような感じでしょうか。

Python

1import matplotlib.pyplot as plt 2import numpy as np 3 4mydict={0:(255,0,0),1:(0,255,0),2:(0,0,255),3:(255,255,0),4:(255,0,255),5:(0,255,255),6:(100,100,100),7:(100,100,0),8:(100,0,100),9:(0,100,100)} 5 6cd = '8,5,3,7,4,7,8,5,4,3,1,4' # とりあえず3x4=12ピクセル分 7cd = list(map(int,cd.split(','))) # カンマ区切り文字列→数値のリストに変換 8print(cd) # [8, 5, 3, 7, 4, 7, 8, 5, 4, 3, 1, 4] 9 10# 色番号から対応するRGB値を取得 11conv = [] 12for x in cd: 13 conv.append(mydict[x]) 14 15# 画像に変換 16pixels = np.array(conv).reshape(3,4,3) 17 18plt.imshow(pixels) 19plt.show()

イメージ説明

投稿2019/05/07 09:10

編集2019/05/09 07:52
can110

総合スコア38262

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

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

secondson

2019/05/09 01:53 編集

書き込んで下さった以下の出力が表示されました。 index= 1 x= 8 is str! また、教えて頂いたコードの数字を変えてみた(8→5)ところ,何故か llist[x]=mydict[x] KeyError: '5' index= 1 x= 5 is str! と表示されました。 更に他の数値に変えた(8→y(0~9))ところ、 llist[x]=mydict[x] KeyError: 'y' index= 1 x= y is str! と表示されました。 この結果はどのようなことを示しているのでしょうか?
can110

2019/05/09 02:05

回答コードのcdの値はあくまでサンプルの値です。実際のcd変数値でコード実行してください。 なお、変数cdの型は実際には何でしょうか?リスト?numpy.array? また、どのようにして生成されたのでしょうか?
secondson

2019/05/09 02:44

type('cd')で確認したところstrでした。。。。 元々strの labels=['1', '1', '3', '3', '5', '5', '5'........', '9', '9', '3', '9', '9', '9'] の数値を、出力した klist=[8, 2, 3, 1, 9, 5, 4, 0, 7, 6] の順番に対応して置換したのがcdです。 klist[0]=8だから、labels内の8を1に置換 klist[1]=2だから、labels内の2を1に置換....... 上記のような置換を目的としてcdを作成しました。 全体的な流れとして、 ・labelsの数値をklistの順番毎で置換する。 ・置換した数値(cd)に対応した画像rgb値((255,0,0)など)を代入する。 ・作成した濃度値の並び([255,0,0],[100,0,100].....)より画像化を目指す。 です。
can110

2019/05/09 03:07

type('cd')ではなくtype(cd)と実行ください。
secondson

2019/05/09 03:53

print(type(cd)) で実行したところ、 <class 'str'>と表示されました。
can110

2019/05/09 05:49

すなわちcdは60000個の数字を含むものすごく長い文字列なのでしょうか? それを確認するため、print(len(cd)) と print(cd[0:10])を実行した結果を教えてください。
secondson

2019/05/09 06:56

print(len(cd))   #119999 print(cd[0:10])  #8,8,7,6,8, となりました。「,」を文字としてカウントしているみたいです。 print(labels(cd))   #60000 であるため、 labelsをcdに変換する際に変な処理をしてしまっているようです。 二つ前のコメントのように、labelsをklistの順番に対応した数値に変換してcdを作成する手順をご教授頂けたら幸いです。
can110

2019/05/09 07:04

labelsをcdに変換する処理の内容がよく分からないので、その部分のコードも質問本文に追記していただけますか?
secondson

2019/05/09 09:10

can110さんの先ほどの追加コメントのコードを試してみたところ望んでいた結果を得ることが出来ました! 何度も初歩的で分かりにくい質問に対して答えて頂きありがとうございました。また難航するかもしれないですが、その時もご助言頂けると幸いです。本当にありがとうございました!
can110

2019/05/09 10:04

解決して良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問