2016-08-05 5 views
0

私が作成しているライブラリでtimespansを処理する必要があります。私の最初のアイデアは、それを単純なものにして、何年もの間、フロートでそれらを体系化することでした。numpy floatの補間問題を避ける

問題は、たとえば補間を実行するときに発生します。私は極端内側

xs = np.array([0, 0.7, 1.2, 3.0]) # times 
ys = np.array([np.nan, 124.3, 214.0, np.nan]) # values associated 
私は値np.nanを取得したいと思い[0.7、1.2]区間外

、しかし、明らかに線形補間、特に を持っていると言います。しかし

、私は、そう7/10に正しい値が、1.2である6/5のためのナンを、

[nan, 124.3, 213.98206, nan, nan] 

を取得

#!/usr/bin/python3.5 

import numpy as np 
from fractions import Fraction 

import scipy.interpolate as scInt 

if __name__ == "__main__": 
    xs = np.array([0, 0.7, 1.2, 3.0]) # times 
    ys = np.array([np.nan, 124.3, 214.0, np.nan]) # values associated 
    interp = scInt.interp1d(xs, ys) 
    xsInt = np.array([0, 7/10, 6/5-0.0001, 6/5, 6/5+0.0001]) 
    print(interp(xsInt)) 

を使用。これに謎はなく、浮きの機械表現は のようなものを引き起こす可能性があります。しかし、とにかくそれは私が対処する必要がある問題です。

最初の考えは、fsの値を2倍にして、 [x1-eps、x1 + eps、x2-eps、x2 + eps、...、xn-eps、xn + eps ]、ysベクトルの2倍を繰り返す: [y1、y1、y2、y2、y3、y3、...、yn、yn]。これは動作しますが、それはかなり醜いです。 それから、私は分数を使うでしょうが、代わりに「オブジェクト配列はサポートされていません」と言っていました。 残念ながら、これは行く方法に見えましたが、確かにパフォーマンスの低下があります。

この問題のもう1つの側面があります:キーが同じ種類の時刻である辞書を作成することができればうれしく、私が検索すると恐れます floatを同じキーとして使用する同じ問題が原因で検索が失敗します。

私の最後のアイデアはdatetime.dateのような日付を使用することでしたが、日付の差をを年の分数に変換するときのあいまいさのためあまり幸せではありません。

これには最適な方法はありますか?良い解決策はありますか?

答えて

1

私はそこから簡単な方法がないと思います。 浮動小数点数は基本的に等価性のチェックには適しておらず、ドメインの端で補間を評価する(または浮動小数点を辞書のキーとして使用する)ことで、これを正確に実行しています。

あなたのイプシロンを使用したソリューションはちょっとハッキリですが、正直なところ、この問題を回避するためのエレガントな方法はありません。

一般に、フロートの平等をチェックすることは、悪い設計選択の兆候となります。あなたはdatetime.dateの使用を考えていると述べたので、これを認識しました。 (私が同意するのは、過剰です。)

補間がそのドメインのエッジで定義されていないことを受け入れ、この仮定をプログラムの設計に適用することをお勧めします。正確な解決策は、あなたがしたいことに依存します。

年の代わりに秒または日を使用することを検討しましたか?たぶん秒を使用すると、定義範囲の境界で補間を照会するのを避けることができますか?秒の整数値のみを使用すると、辞書のキーとして簡単に使用できます。

+0

ありがとうございました、はい、私は整数を日数で使用することを考えましたが、最終的にはそれが私の行うことです。私はこれまで避けていましたが、何回も私は「1ヶ月」経過しており、30日であれば12ヶ月は1年よりも短いです。しかし、私は1年間を360日間と数えます。それはそれです。 – zeycus

+0

面白いですが、私は現在整数を使用していますが、補間で同じ問題が発生します。 scipy.integrate.interp1dのドキュメントを見ると、x引数は「実数値の1次元配列」です。私のハックなソリューションの周りに方法はないと思われる? – zeycus

+0

うーん、あなたは正しいかもしれない... –