2016-11-13 65 views
0

如蟒蛇初學者,我開始實施一個想法,我已經在Matlab中實現。我想確定數組的交點(x,y座標),而沒有給出明確的函數。也就是說,只有int值的數組可能與浮點座標有交點。因此,www提供了以下代碼,請參閱附件。np.array路口// AttributeError的:「模塊」對象有沒有屬性「PiecewisePolynomial」

通過PIP scipyinterpolate安裝後,我解決不了即將到來的

ERROR: AttributeError: 'module' object has no attribute 'PiecewisePolynomial'. 

搜索功能並沒有幫助。

我將非常高興通過

  1. 接收一些幫助解決該ERROR

或/和

  • 不同計算交點(是SciPy的唯一的方式)
  • PS:計算經由d的交點MATLAB的。差分不是權宜之計,由於路口的一些間隔

    import scipy.interpolate as interpolate 
    import scipy.optimize as optimize 
    import numpy as np 
    
    x1=np.array([1.4,2.1,3,5.9,8,9,23]) 
    y1=np.array([2.3,3.1,1,3.9,8,9,11]) 
    x2=np.array([1,2,3,4,6,8,9]) 
    y2=np.array([4,12,7,1,6.3,8.5,12])  
    
    p1 = interpolate.PiecewisePolynomial(x1,y1[:,np.newaxis]) 
    p2 = interpolate.PiecewisePolynomial(x2,y2[:,np.newaxis]) 
    
    def pdiff(x): 
        return p1(x)-p2(x) 
    
    xs=np.r_[x1,x2] 
    xs.sort() 
    x_min=xs.min() 
    x_max=xs.max() 
    x_mid=xs[:-1]+np.diff(xs)/2 
    roots=set() 
    for val in x_mid: 
        root,infodict,ier,mesg = optimize.fsolve(pdiff,val,full_output=True) 
        # ier==1 indicates a root has been found 
        if ier==1 and x_min<root<x_max: 
         roots.add(root[0]) 
    roots=list(roots)   
    print(np.column_stack((roots,p1(roots),p2(roots)))) 
    
    +1

    較新版本的scipy似乎沒有這種方法,['PPoly'](https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.interpolate.PPoly。 html#scipy.interpolate.PPoly)似乎是可用的(它具有不同的語法和語義)。 –

    +0

    你明白錯誤在告訴你什麼嗎? – wwii

    +0

    你是說你在網上找到了一些代碼,你不知道它是如何工作的? – wwii

    回答

    1

    正如我在評論指出的獨特性,你試圖使用的方法是不是在SciPy的較新型號的,但它沒」不管做什麼你都希望它做什麼。

    我的建議是使用numpy.interpscipy.interpolate.interp1d來構建你的函數線性內插,然後使用fsolve因爲你沒有找到所有可能的交叉點。由於fsolve(很像MATLAB的fzero)一次只能找到一個交點,所以您確實需要遍歷數據中的各個部分以查找交點。

    import scipy.interpolate as interpolate 
    import scipy.optimize as optimize 
    import numpy as np 
    
    x1 = np.array([1.4,2.1,3,5.9,8,9,23]) 
    y1 = np.array([2.3,3.1,1,3.9,8,9,11]) 
    x2 = np.array([1,2,3,4,6,8,9]) 
    y2 = np.array([4,12,7,1,6.3,8.5,12])  
    
    # linear interpolators 
    opts = {'fill_value': 'extrapolate'} 
    f1 = interpolate.interp1d(x1,y1,**opts) 
    f2 = interpolate.interp1d(x2,y2,**opts) 
    
    # possible range for an intersection 
    xmin = np.min((x1,x2)) 
    xmax = np.max((x1,x2)) 
    
    # number of intersections 
    xuniq = np.unique((x1,x2)) 
    xvals = xuniq[(xmin<=xuniq) & (xuniq<=xmax)] 
    # note that it's bad practice to compare floats exactly 
    # but worst case here is a bit of redundance, no harm 
    
    # for each combined interval there can be at most 1 intersection, 
    # so looping over xvals should hopefully be enough 
    # one can always err on the safe side and loop over a `np.linspace` 
    
    intersects = [] 
    for xval in xvals: 
        x0, = optimize.fsolve(lambda x: f1(x)-f2(x), xval) 
        if (xmin<=x0<=xmax 
         and np.isclose(f1(x0),f2(x0)) 
         and not any(np.isclose(x0,intersects))): 
         intersects.append(x0) 
    
    print(intersects) 
    print(f1(intersects)) 
    print(f2(intersects)) 
    
    從算法的問題較多的部分中的一些運行時警告

    除此之外,上述發現你的函數的兩個交點:

    plot of functions

    關鍵步驟檢查從fsolve結果是新的(不接近你以前的根源),並且你確實在給定的x0處找到了根。

    或者,您可以使用xvals中定義的區間,檢查每個區間的分段線性函數,並分析檢查這兩個參數(我的意思是x1=xvals[i],x2=xvals[i+1], y11=f1[x1], y12=f1[x2]等)在給定區段上是否有交集。您可能可以將這種方法進行矢量化處理,您不必擔心結果中的隨機性,並且您只需要注意數據中可能出現的奇點(其中np.diff(xvals)很小,並且您將以此除數) 。


    numpy.interp沒有定義的內插器的功能,而直接計算在網格上的內插值。爲了使用此功能執行相同的操作,您必須定義一個函數,該函數針對給定的x值調用numpy.interp。由於在零搜索期間大量的功能評估,這可能會比上述效率低。

    +0

    謝謝Andras Deak對你的大力幫助。它爲我工作。我將逐步分析你的代碼,以更好地理解python。儘管存在運行時警告(=效率較低),但我對Python的速度印象深刻。我想知道,算法如何與更多的數據點和交叉點一起工作,會檢查這個問題。十分感謝 ! – IMHO

    +0

    @IMHO我很高興我能幫忙:)一些代碼可能不完全是慣用的,但我無法想出更優雅的解決方案。警告大多告訴你,零搜索不夠好,所以它對速度的描述很少。特別是對於很多交叉點,您應該考慮實施替代路線:查看'xvals'中的每個區間並分析計算/檢查交叉點(不含'fsolve')。你明白我的意思嗎? –

    +1

    @ Andras Deak我尊重你的謙虛,但在我看來你做得很好,再次非常感謝。作爲一個提問者,我得到了一個超級快速和詳細的答案,並且您對scipy.interpolate.interp1d&numpy.interp的提示對於Python初學者來說是值得的。我甚至沒有想到新版本的scipy似乎沒有我的方法。我仍然不明白爲什麼方法應該刪除在一個新的版本沒有提示其他方法,只是一個錯誤。你的代碼在〜4000個數據點和~300個交點處工作得很好。我確實瞭解你的分析描述,並會嘗試實施它。 – IMHO

    相關問題