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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

1回答

1175閲覧

numpy配列同士の計算が過大・過小な結果を返す

Anonymous2020

総合スコア7

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

0クリップ

投稿2021/02/11 07:18

編集2021/02/11 07:41

前提・実現したいこと

numpy同士の計算で原理的に-1から1の間にまとめられる指数を算出しようとしているのですが、
なぜか想定される範囲から値がはみ出てしまいます。
正規化植生指数【リンク】:ndvi = (ir-red)/(ir+red)

おそらく内部で計算が発散しているのが原因だと思うのですが、正しく出力する方法はございますでしょうか

該当のソースコード

Python

1 2########## 計算対象配列の確認 3print('ir.shape:{}, red.shape:{}'.format(ir.shape, red.shape)) 4#ir.shape:(4041, 6538), red.shape:(4041, 6538) 5 6print('ir.dtype:{}, red.dtype:{}'.format(ir.dtype, red.dtype)) 7#ir.dtype:int16, red.dtype:int16 8 9print('ir, min:{}, max:{}'.format(ir.min(), ir.max())) 10print('red, min:{}, max:{}'.format(red.min(), red.max())) 11#ir, min:-2000.0, max:16714.0 12#red, min:-1341.0, max:16000.0 13 14print('whether to have finite numbers:',np.isfinite(ir).all()) #配列内の要素がすべて有限の数であることを確認 15print('whether to have finite numbers:',np.isfinite(red).all()) #配列内の要素がすべて有限の数であることを確認 16 17########## 計算 18 19ir = ir.astype(np.float) #小数計算ができるように浮動小数点に変換 20red = red.astype(np.float) 21ndvi = (ir-red)/(ir+red) # 各要素に-1から1の間に値が入るはず 22ndvi[ndvi==np.inf] = 0 #0割(ir+red=0の時発生)で生じたnp.infを変換 23 24########## 確認 (結果が-1~1の範囲を超えてしまう) 25print( 'above 1 : {}'.format( np.count_nonzero(ndvi > 1)) ) #above 1 : 1792215 26print( 'below -1 : {}'.format( np.count_nonzero(ndvi < -1)) ) #below -1 : 583745 27print('ndvi, min:{}, max:{}'.format(ndvi.min(), ndvi.max())) 28#ndvi, min:-1.7976931348623157e+308, max:1.7976931348623157e+308

試したこと

元々のnumpy配列が発散していないかは確認済み

補足情報(FW/ツールのバージョンなど)

Google Colabで計算

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

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

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

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

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

tiitoi

2021/02/11 07:35

ndvi.min(), ndvi.max() はどうなっていますか?
Anonymous2020

2021/02/11 07:42

ご対応ありがとうございます min:-1.7976931348623157e+308, max:1.7976931348623157e+308 が出力されてしまいます(ソースコードに追記済み)
guest

回答1

0

ベストアンサー

誤読してたらすみません。irもredも正負両方とりうるんですよね。
普通に1超えるのでは…?

python3

1#ir, min:-2000.0, max:16714.0 2#red, min:-1341.0, max:16000.0 3 4ir = 2 5red = -1 6ndvi = (ir-red)/(ir+red) 7print(ndvi) 8# 3.0

投稿2021/02/11 07:45

jeanbiego

総合スコア3966

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

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

Anonymous2020

2021/02/11 08:07

大変失礼いたしました。 リンク先で紹介されている指数は正の数を用いて計算することが前提のようでした。。。 ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問