2016-07-04 14 views
2

私は直線的に補間し、その後にその輪郭データを補間します。計算のため私は入力データに何個の小数が入るのかわからないので、私は浮動小数点型を使用します。場合によっては小数点以下はなく、時には1または10を超えることもあります。フロートアーチファクトを伴わない輪郭

残念ながら浮動小数点数の補間と同じ値の輪郭付けを使用しているため、不要なアーティファクトが発生します。どのようにすべきではないところに輪郭のアーティファクトを生成しないようにコードを修正するにはどうすればよいですか?

簡単なコードの例は:あなたの例では

import numpy as np 
from scipy.interpolate import griddata 
import matplotlib.pyplot as plt 

interval_in = np.linspace(1, 100, 10) 
interval_out = np.linspace(1, 100, 100) 
xin, yin = np.meshgrid(interval_in, interval_in) 
zin = np.ones((10, 10))*10 
xout, yout = np.meshgrid(interval_out, interval_out) 
zout = griddata((xin.flatten(),yin.flatten()),zin.flatten(),(xout,yout),method='linear') 

contours = plt.contour(xout, yout, zout, levels=[10]) 
plt.show() 

Contour artifacts

答えて

2

zoutはすべて10であってもよいが、実際に9.9999999999999982と10.000000000000002の間で変化し、その輪郭がこれをプロットしようとしている必要があります。あなたのデータは、大規模な範囲を持っている場合、輪郭が正しく動作しなければならない、けれどもあなたは

+0

が、私はそれがフロート問題で認識しています、ありがとう...、与えられた精度に丸め

zout_ = np.round_(zout, decimals=3) contours = plt.contour(xout, yout, zout_, levels=[10]) plt.show() 

をnumpyの使用することができます。この質問をする前に、私は同じコードを整数で試してみましたが、アーティファクトをまったく作成しませんでした。私の問題は、3つの小数点以下を四捨五入することはできませんが、輪郭への入力値が0.0000001〜0.0000002に等しく、等高線の間隔が適切な場合があるためです。しかし、もう一度考えると、入力値の最小値/最大値に基づいて適切な数の小数点以下を四捨五入することができます。 – Miro

+0

実際、浮動小数点の問題を取り除くために、私のコードでは常に小数点以下12桁まで四捨五入することができます。それは私のためにします。ありがとうございました。 – Miro