2017-03-09 12 views
1

私はリストにある角度を補間しようとしていました。角度補間

Dir DirOffset 
0 109.6085 
30 77.5099 
60 30.5287 
90 -10.2748 
120 -75.359 
150 -147.6015 
180 -162.7055 
210 21.0103 
240 3.5502 
270 -11.5475 
300 -39.8371 
330 -109.5473 
360 109.6085 

enter image description here

私は長い時間がかかっている角度を(これは、補間値に到達するために角度の間で平均値を計算する上で続ける)を補間するためにコードを書かれています。もし誰かがより速くて短いコードを持っているなら、私を助けてください。

enter image description here

from cmath import rect, phase 
from math import radians, degrees, sqrt 

#Calculate the mean of angles in List 
def mean_angle(degArray): 
    return degrees(phase(sum(rect(1, radians(d)) for d in degArray)/len(degArray))) 

#Calculate Interpolation Angle 
def Interpolate_angle(Dir, DirOffset, ValuetoInterpolate): 
    #Create Lower and Higher bin of ValuetoInterpolate 
    DirLBin = round(float(ValuetoInterpolate)/30,0)*30 
    DirHBin = round(float(ValuetoInterpolate+15)/30,0)*30 

    #Check if the ValuetoInterpolate lies between Lower and Higher bin 
    if DirLBin == DirHBin: 
     DirLBin = DirHBin-30 
     if DirLBin <= ValuetoInterpolate <= DirHBin: 
      DBin = [float(DirLBin), float(DirHBin)] 
      Doff = [DirOffset[Dir.index(DirLBin)], DirOffset[Dir.index(DirHBin)]] 
     else: 
      DirHBin = DirLBin+30 
      DBin = [float(DirLBin), float(DirHBin)] 
      Doff = [DirOffset[Dir.index(DirLBin)], DirOffset[Dir.index(DirHBin)]] 

    else: 
     DBin = [float(DirLBin), float(DirHBin)] 
     Doff = [DirOffset[Dir.index(DirLBin)], DirOffset[Dir.index(DirHBin)]] 

    #Run 50 iterations to calculate the mean of angle and find the ValuetoInterpolate  
    for i in range(51): 
     DMean = mean_angle(DBin) 
     DOMean = mean_angle(Doff) 
     if DMean < 0 : 
      DMean = 360+DMean 

     if DBin[0] <= ValuetoInterpolate <=DMean: 
      DBin = [float(DBin[0]), float(DMean)] 
      Doff = [float(Doff[0]), float(DOMean)] 
     else: 
      DBin = [float(DMean), float(DBin[1])] 
      Doff = [float(DOMean), float(Doff[1])] 

    return DOMean 

Dir = range(0,370,30) 
DirOffset = [109.6085,77.5099,30.5287,-10.2748,-75.359,-147.6015,-162.7055,21.0103,3.5502,-11.5475,-39.8371,-109.5473,109.6085] 
ValuetoInterpolate = 194.4 
print Interpolate_angle(Dir, DirOffset, ValuetoInterpolate) 

答えて

2

私はその後、私は私の要件ごとに解を得るために少し変更され、stackoverflowのからの回答を検索した後上記の質問のためのソリューションを得ました。解決策は、それを必要とする人にとっては有用かもしれません。

360(360度と0度が同じになるまで)の各指向性ビン(0,30,60 .... 360)に対して以下の関数を使用して度数を補間し、それらを辞書に格納してDataFrameを作成する(pandas DataFrame )、それをメインのDataFrameと結合してさらに処理します。

enter image description here

DEF InterpolateDegrees(109.6085,77.5099)

は0.1(0.0、0.1、0.2、0.3の間隔で30度にDirectionOffset 0の補間された配列を返します...... 28.7 、29.8、29.9)

import numpy as np 
from math import fabs 

def InterpolateDegrees(start, end, BinSector=12): 
    BinAngle = 360/BinSector 
    amount = np.arange(0,1,(1/(BinAngle/0.1))) 
    dif = fabs(end-start) 
    if dif >180: 
     if end>start: 
      start+=360 
     else: 
      end+=360 

    #Interpolate it 
    value = (start + ((end-start)*amount)) 

    #Wrap it 
    rzero = 360 

    Arr = np.where((value>=0) & (value<=360), (value), (value % rzero)) 
    return Arr