1

変位センサーからデータを取得しました。1 回の反復のデルタ値は次のようになります。0, 1, 2, 4, 7, 9, 14, 24, 14, 10, 9, 7, 3 2, 1, 0, 0, 0, 0, -1, -3, -5, -7, - 9, -14, -24, -14, -9, -8, -6, -4, -3, -1, 0, 0, 0. (他の繰り返しも同じパターンです.)

曲線の最大点と最小点に興味があります。最初の位置から始めて、この位置に戻り、ラインのループを行います (合計の変位またはラインを取得するために、値の部分的な合計を取得しました)。部分和は次のようになります [0, 1, 3, 7, 14, 23, 37, 61, 75, 85, 94, 101, 104, 106, 107, 107, 107, 107, 107, 106, 103, 98 、91、82、68、44、30、21、13、7、3、0、-1、-1、-1、-1]。107 と -1 (次の曲線の最小値) に興味があります。

しかし、私は言うn noのコードを理解していません。曲線の (反復)。これで私を助けてもらえますか?

4

1 に答える 1

2

この関数を使用して、絶対極値を取得できます。

def extrema(value, deltas):
    max_value = min_value = value
    for delta in deltas:
        value += delta
        if value < min_value:
            min_value = value
        elif value > max_value:
            max_value = value
    return min_value, max_value

ここで、局所極値を生成するように関数を適応させました。

def extrema(value, deltas):
    values = [value]
    for delta in deltas:
        value += delta
        values.append(value)
    average = sum(values)/len(values)
    threshold = (max(values) - min(values))/6
    min_threshold = average - threshold
    max_threshold = average + threshold
    min_value = max_value = None
    for value in values:
        if value < min_threshold:
            if min_value is None or value < min_value:
                min_value = value
        elif value > max_threshold:
            if max_value is None or value > max_value:
                max_value = value
        elif min_value is not None and max_value is not None:
            yield min_value, max_value
            max_value = min_value = None

ここから機能を微調整できます。たとえば、関数はmin_threshold < value < max_thresholdサイクルの開始を見つけるまで最初の値をスキップし、完全なサイクルで終了しなかった場合、最後に最後の極値を生成する可能性があります。

最後に、サンプルデータのようにポイントタプルで機能する関数を次に示します。

class Point(object):

    __slots__ = ('x', 'y')

    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __repr__(self):
        return str((self.x, self.y))

    def __iadd__(self, other):
        self.x += other.x
        self.y += other.y
        return self

    def __isub__(self, other):
        self.x -= other.x
        self.y -= other.y
        return self

    def __idiv__(self, number):
        self.x /= number
        self.y /= number
        return self

    def abs(self):
        return abs(self.x) + abs(self.y)

    def copy(self):
        return Point(self.x, self.y)


def extrema(moves, jitter=0.1, threshold=1000, sample=16):
    point = Point()
    minpoint = Point()
    maxpoint = Point()
    average = Point()
    average /= 1.0
    turned = False
    for move in moves:
        point += move
        x = point.x
        if x < minpoint.x:
            minpoint.x = x
        elif x > maxpoint.x:
            maxpoint.x = x
        y = point.y
        if y < minpoint.y:
            minpoint.y = y
        elif y > maxpoint.y:
            maxpoint.y = y
        delta = move.copy()
        delta -= average
        delta /= sample
        average += delta
        if average.abs() < jitter:
            if point.abs() > threshold:
                turned = True
            elif turned:
                yield minpoint, maxpoint
                point = Point() # reset (calibrate)
                minpoint = Point()
                maxpoint = Point()
                turned = False


# read data from file
moves = [Point(*map(int, move.split(',')))
    for move in open('data.txt').read().split(';') if move]

# generate extrema
print list(extrema(moves))
于 2011-11-27T13:43:58.467 に答える