前提・実現したいこと
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で計算
回答1件
あなたの回答
tips
プレビュー