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

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

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

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

Q&A

解決済

2回答

380閲覧

(numpy行列範囲内数値個数抜き出し)関数を、実行する度リストがどんどん巨大化していく・・・。

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/04/21 12:20

編集2021/04/21 13:48

指定範囲内の数値の個数を抜き出したいのに抜き取れない。
*すいませんreturnのインデント間違っていたので直しました。

python

1# PILで開いたうえでデータをNumpy形式にする 2# (例えばJPEGは圧縮されていてNumpyな配列になっていないので、 3# そこからNumpyのデータ空間(?)に持ってくる必要がある) 4reiimg = Image.open("drive/My Drive/mnist_dataset/rei.jpg") 5reiimg = reiimg.resize((10, 10)) 6reiimg = np.asarray(reiimg) 7 8def extract(x, y): 9 # カラー画像の時Gだけ抜き取りたい 10 if len(x.shape) == 3: 11 h, w, ch = x.shape 12 13 # RGBのGだけ抜き取りたい 14 return x[:,:,y] 15 16v_max, v_min = 300, 200 17 18#g 19img_g = extract(reiimg, 1) 20 21imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] 22 23print(img_g) 24 25def diff(x): 26 for (img, imgt) in zip(x, x.T): 27 rows = img[(v_min<img)&(v_max>img)] 28 columns = imgt[(v_min<imgt)&(v_max>imgt)] 29 imgrows.append(rows) 30 lenrows.append(len(rows)) 31 imgcolumns.append(columns) 32 lencolumns.append(len(columns)) 33 return lenrows + lencolumns

上の行列から一行ずつ、そして一列ずつ、200~300の間の数値の個数を抜き取りたいのですが、
この出力結果が

[5, 2, 0, 0, 0, 1, 5, 4, 4, 4, 4, 3, 2, 2, 2, 0, 3, 3, 3, 3]
[5, 2, 0, 0, 0, 1, 5, 4, 4, 4, 6, 5, 1, 1, 1, 1, 5, 0, 4, 4, 4, 3, 2, 2, 2, 0, 3, 3, 3, 3, 7, 3, 3, 3, 3, 1, 2, 2, 2, 2]
[5, 2, 0, 0, 0, 1, 5, 4, 4, 4, 6, 5, 1, 1, 1, 1, 5, 0, 4, 4, 5, 0, 4, 8, 8, 2, 5, 3, 10, 10, 4, 3, 2, 2, 2, 0, 3, 3, 3, 3, 7, 3, 3, 3, 3, 1, 2, 2, 2, 2, 5, 5, 8, 7, 6, 4, 5, 5, 5, 5]
[5, 2, 0, 0, 0, 1, 5, 4, 4, 4, 6, 5, 1, 1, 1, 1, 5, 0, 4, 4, 5, 0, 4, 8, 8, 2, 5, 3, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 2, 2, 0, 3, 3, 3, 3, 7, 3, 3, 3, 3, 1, 2, 2, 2, 2, 5, 5, 8, 7, 6, 4, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
・・・

となり、どんどん増えていってます、なぜでしょう、行と列は一緒で、
RGBの各リストの大きさは同じだから、出力されるリストの大きさも同じになるはずなんですが・・・。
ちなみにgとbを逆にすると、今度はbのリスト数が小さくなり、gのリストが大きくなります、大きさが交換されます。

ちなみに上2つのリストについてなんですが、
一番上のリストは問題なく実行されていて、問題の2番目ですが、これは、

[5, 2, 0, 0, 0, 1, 5, 4, 4, 4,
6, 5, 1, 1, 1, 1, 5, 0, 4, 4,
4, 3, 2, 2, 2, 0, 3, 3, 3, 3,
7, 3, 3, 3, 3, 1, 2, 2, 2, 2]

まぁこんな風に分割できて、この一番上と上から3番目は、それぞれbの行と列に対する正しい実行結果なのですが、
上から二番目と四番目は、先程の、gのそれぞれ行と列の実行結果なんですよね、
なんでこんなごちゃまぜになっちゃったんでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

シンプルに関数の外でリストを作っているからでは。

patch

1- imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] 2 3print(img_g) 4 5def diff(x): 6+ imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] 7# 関数内で毎回リストを作らないと、「グローバル変数」のリストが常に参照されます 8# ...

投稿2021/04/21 17:19

hayataka2049

総合スコア30935

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

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

退会済みユーザー

退会済みユーザー

2021/04/21 18:25

それかも知れないです、実は関数化を諦めて、いちいちforを個別に作ったのですが、 もう1度この方法で関数化に挑戦してみようかなと思っています。
guest

0

returnのインデント位置が間違っているかと思います。

投稿2021/04/21 12:24

meg_

総合スコア10760

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

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

退会済みユーザー

退会済みユーザー

2021/04/21 13:11 編集

その通りでしたありがとうございます、が、まだうまく行きません。 関数を利用するたびにリストの大きさが拡大していくのはなぜでしょう・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問