折れ線の折れ曲がりポイントを旅する python

numpy だろって?

変曲点を求めるってこと、つまりはとーぜん二階微分をとってそれがゼロでない位置を見つける問題に過ぎないので、Python を使うつもりなら NumPy/SciPy の得意分野だ。

けど今やりたいことの都合上、NumPy なしでやりたい(出来る)て話。こんなんでいいかしら?:

 1 >>> # -*- coding: utf-8 -*-
 2 >>> input = list(range(5)) + \
 3 ...     list(range(5, 1, -1)) + \
 4 ...     list(range(5, 12, 3)) + \
 5 ...     list(range(9, 0, -1))
 6 >>> 
 7 >>> # x   [ 0,  1,  2,  3,  4,  5,  4,  3,  2,  5,  8, 11,  9,  8,  7,  6,  5,  4,  3,  2,  1]
 8 >>> # x'      [ 1,  1,  1,  1,  1, -1, -1, -1,  3,  3,  3, -2, -1, -1, -1, -1, -1, -1, -1, -1]
 9 >>> # x''         [ 0,  0,  0,  0, -2,  0,  0,  4,  0,  0, -5,  1,  0,  0,  0,  0,  0,  0,  0]
10 >>> xd = [b - a for a, b in zip(input[:-1], input[1:])]
11 >>> xdd = [b - a for a, b in zip(xd[:-1], xd[1:])]
12 >>> inds = [0] + [
13 ...     (i + 1) for i, d in enumerate(xdd) if d != 0
14 ...     ] + [len(input) - 1]
15 >>> 
16 >>> #
17 >>> print([input[i] for i in inds])
18 [0, 5, 2, 11, 9, 1]

なんでいまさら?

ちょっとね、「trace.py -t の結果に基づくコード実行の可視化ビデオ」なんてネタをこれの一環でやりたくて、その際に必要なの。つまり「1行目、2行目、…、540行目、…」という具合に、上から順に流れていく際、その全てを記憶しておく必要はなく、また、それをすると「とてつもないサイズ(の ffmpeg の filter_complex スクリプト)」になっちゃう、って話。


2019-04-27追記:
これの成果。作りたかったビデオてのはこんなの: