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

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

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

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

Python

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

Q&A

解決済

4回答

10388閲覧

処理後の配列の次元を変えるとエラーがでる

uni_tt

総合スコア15

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/01/11 12:41

###前提・実現したいこと
二次元配列を一次元配列にして、配列の要素と指定した値が一致した場合、要素の値を変更する。
その後また、二次元配列に変更するといった処理行いたいと思っています。

###発生している問題・エラーメッセージ
ループ処理を内包表記で記述すると

dst = dst.reshape((3, 3)) AttributeError: 'list' object has no attribute 'reshape'

とエラーが出ました。

###該当のソースコード

python

1import cv2 2import numpy as np 3import sys 4 5def main(): 6 max_index = 1 7 dst = np.array([[1, 1, 1], 8 [1, 8, 1], 9 [1, 1, 1]]) 10 11 dst = dst.reshape((-1)) 12 13 dst = [255 if dst[index] == max_index else 0 for index in range(len(dst))] 14 15 """ 16 for index in range(len(dst)): 17 if dst[index] == max_index: 18 dst[index] = 255; 19 else: 20 dst[index] = 0; 21 """ 22 23 dst = dst.reshape((3, 3)) 24 25if __name__ == '__main__': 26 param = sys.argv 27 main()

###試したこと
当初は
dst[index] = [255 if dst[index] == max_index else 0 for index in range(len(dst))]
と記述していたのですが以下のエラーが出たためソースの通りに変更しました。

NameError: name 'index' is not defined

また内包表記で書かなかった場合は実行できたので、その時の配列と内包表記を使った配列を比較すると
内包表記を使わなかった場合は

[255 255 255 255 0 255 255 255 255]

内包表記で配列を変更した場合は

[255, 255, 255, 255, 0, 255, 255, 255, 255]

となりましたがこの違いが何を意味するのかわかりません。理由と解決方法を教えていただけないでしょうか。

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

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

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

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

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

guest

回答4

0

numpy.ndarrayオブジェクトと組み込み型のlistをごっちゃにしておられませんか?

python

1np.array([リスト内包表記])

こんな感じでキャストする必要があると思います。

ついでですけど、内包表記の部分も直すと、

python

1dst = np.array([255 if elm == max_index else 0 for elm in dst])

これで期待通りの結果が得られると思います。

投稿2018/01/11 12:49

編集2018/01/11 13:08
namnium1125

総合スコア2043

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

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

uni_tt

2018/01/12 01:53

ご指摘の通りそれぞれをごっちゃに覚えていました。 ありがとうございます。
guest

0

ベストアンサー

dst = np.array([255 if dst[index] == max_index else 0 for index in range(len(dst))])
では。


以下のエラーが出たためソースの通りに変更しました。

左辺にindexを使ってるからです。
indexという値は内包表記内部でのみ、この場合有効です。


この違いが何を意味するのかわかりません。

np.arrayと組み込みリストの出力形式が違うだけかと。

Python

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

投稿2018/01/11 12:48

編集2018/01/11 12:51
LouiS0616

総合スコア35658

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

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

uni_tt

2018/01/12 01:53

無事解決できました。 今後も何かありましたらお願いします。
guest

0

内包表記を使わず1行で済むコードがあるので参考にしてください。

python

1import numpy as np 2from pprint import pprint 3 4dst = np.array([[1, 1, 1], 5 [1, 8, 1], 6 [1, 1, 1]]) 7 8dst = np.where(dst==1, 255, 0) 9pprint(dst) 10 11""" 12array([[255, 255, 255], 13 [255, 0, 255], 14 [255, 255, 255]]) 15""" 16

投稿2018/01/12 10:54

wakame

総合スコア1170

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

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

0

質問の解決とはなりませんが、より高速に処理できる方法があったのでこちらに記述させていただきます。

python

1dst[dst==max_index] = 255 2dst[dst!=255] = 0

投稿2018/01/12 04:16

uni_tt

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問