NHKアカデミア 村山斉先生のランダムウォーク人生

投稿者: | 2022年5月18日

「NHKアカデミア 」で村山斉先生の人生をなぞらえたrandom walkの動画を作成して提供しました。テレビでも放映されるそうです。

  • 2022年6月28日(火) 午後10時14分~【Eテレ】
  • 2022年7月4日(月)  午後15時14分~   【Eテレ】(再放送)

Web上でも当分間公開されるようです。私自身も自由気ままな人生を過ごした方なので、村山斉先生のお話に共感するところがありました。

https://www2.nhk.or.jp/learning/academia/video/?das_id=D0024300103_00000

作成したvideoは1920 x 1080サイズとし、

  • 100ステップまたは1000ステップ
  • 画面の中央を初期座標または全データでセンタリング
  • 乱数の違う5パターン

2 x 2 x 5=20個のvideoを作りました。

動画作成用のPythonスクリプト

import numpy as np
import matplotlib.pyplot as plt
import subprocess as sp
import argparse

par = argparse.ArgumentParser(description="2D random-walk movie generator")
par.add_argument('--step', default=1000, type=int)
par.add_argument('--seed', default=3, type=int)
par.add_argument('--nmovie', default=5, type=int)
par.add_argument('--base', default="walk")
par.add_argument('--center', default="start", choices=["start", "data"])
args = par.parse_args()

p_dic = {}
p_dic['step'] = args.step
p_dic['seed'] = args.seed
p_dic['nmovie'] = args.nmovie
np.random.seed(p_dic['seed'])
com = 'ffmpeg -i %04d.png -pix_fmt yuv420p -vcodec libx264 '
com += '-vf "scale=1920:-2" -y '
com += '{}'.format(args.base) + '-{}.mp4'

def MakeCoord():
    theta = np.random.random(p_dic['step']-1) * 2 * np.pi
    x = np.cos(theta)
    y = np.sin(theta)
    x = np.append(0.0, x)
    y = np.append(0.0, y)
    x = np.cumsum(x)
    y = np.cumsum(y)
    return x, y


sp.run("rm -f *.png", shell=True)
for n in range(1, p_dic['nmovie']+1):
    x, y = MakeCoord()
    if args.center == "data":
        lx = x.max() - x.min()
        ly = y.max() - y.min()
        xlim = (x.min() - 0.05*lx, x.max() + 0.05*lx)
        ylim = (y.min() - 0.05*lx, y.max() + 0.05*ly)
    if args.center == "start":
        lx = np.max([np.abs(x.max()), np.abs(x.min())])
        ly = np.max([np.abs(y.max()), np.abs(y.min())])
        xlim = (-lx - 0.05*lx, lx + 0.05*lx)
        ylim = (-ly - 0.05*ly, ly + 0.05*ly)
    for i in range(1, x.shape[0]+1):
        fig, ax = plt.subplots(figsize=(16, 9*1080/1074), dpi=120)
        ax.axes.yaxis.set_visible(False)
        ax.axes.yaxis.set_ticks([])
        ax.axes.yaxis.set_ticklabels([])
        ax.axes.xaxis.set_visible(False)
        ax.axes.xaxis.set_ticks([])
        ax.axes.xaxis.set_ticklabels([])
        ax.plot(x[:i], y[:i], color="orange")
        ax.plot(x[i-1], y[i-1], ".", color="black", ms=16)
        ax.set_xlim(xlim)
        ax.set_ylim(ylim)
        fig.tight_layout()
        fig.savefig(f"{i:04d}.png")
        plt.close()
        print(f"{n} movie", "{}/{}".format(i, x.shape[0]))
    sp.run(com.format(n), shell=True)
    sp.run("rm -f *.png", shell=True)

これをshellで回した。

#!/bin/sh
com="./random_walk.py --seed 3 --nmovie 5"
$com --step 0100 --center data  --base walk_0100steps_data
$com --step 0100 --center start --base walk_0100steps_start
$com --step 1000 --center data  --base walk_1000steps_data
$com --step 1000 --center start --base walk_1000steps_start