気になるなあ。
プロジェクトページに論文もありました。
http://www.byungsoo.me/project/deep-fluids/paper.pdf
論文とオープンソースのコラボは最強だな。憧れますね。
気になるなあ。
プロジェクトページに論文もありました。
http://www.byungsoo.me/project/deep-fluids/paper.pdf
論文とオープンソースのコラボは最強だな。憧れますね。
久しぶりに浮遊砂のプログラムを書いているのでチェック用に書いてみました。
ソースは以下です。
いつもInkscape使ってたけど、WSL-ubuntuだとこれで一発。複数ページは無理だけど。
pdftocairo -svg test.pdf test.svg
シェルスクリプトでの連続実行はこんな感じ
#!/bin/sh files="*.pdf" for filepath in ${files} do echo $filepath pdftocairo -svg "${filepath}" "${filepath}.svg" done
なお、インストール方法は以下のとおりです。
sudo apt update
sudo apt -y install poppler-utils
初めてgoogle Colaboratoryを使ってみましたがやばいですね。いきなりtensorflowが使える。ちょっとした作業ならanacondaより圧倒的に楽。
こんな感じの多列砂州形成の計算をしてみたい。
静岡河川事務所HPよりリンク
このブロクの人気記事であるnumba.jit関連について、もう少し詳しく書いてみました。
computational-sediment-hyd.hatenablog.jp
私はnumba.jitのヘビーユーザーです。おかげで数日かかるような科学技術計算もpythonで書くようになりました。
numba.jitでは単純な処理の反復が高速化されます。そのため、幾何演算や科学技術計算で効果的です。
自分の勉強のためにも、numba.jitの特徴をまとめておきます。
ポリゴンの面積を計算するコードでnumba.jitを解説します。
面積を計算する式はこんな感じです。
shapelyで半径1の円を簡素化して多角形を作成。64角形になりました。
from shapely.geometry import Point p = Point(0.0, 0.0) x = p.buffer(1.0) s = x.simplify(0.001, preserve_topology=False) polygon = np.array( [ p for p in s.exterior.coords]) len(polygon) # 65
上のポリゴンの面積を求めるプログラムはこんな感じでしょうか。当然面積はほぼ3.14になります。
import numpy as np def poly(p): s = np.array( [ p[i-1][0]*p[i][1] - p[i][0]*p[i-1][1] for i in range(1, len(p)) ] ) return 0.5*np.abs(np.sum(s)) poly(np.array(polygon))
numba.jitを使う場合は、defの前に@jit(nopython=True)を付けて、
import numpy as np from numba import jit @jit(nopython=True) def poly_numba(p): s = np.array( [ p[i-1][0]*p[i][1] - p[i][0]*p[i-1][1] for i in range(1, len(p)) ] ) return 0.5*np.abs(np.sum(s))
です。ほとんど何も変わりません。
さっそく上の2つのコードの速度比較です。
%%timeit poly(np.array(polygon))
105 µs ± 1.04 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit poly_numba(np.array(polygon))
1.1 µs ± 34.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
なんとこれだけで約100倍の速度差が出ます。
numba.jitは関数の定義時に通常の場合と比較して若干時間がかかります。関数の定義を含めて時間計測を行うと、
%%timeit def poly(p): s = np.array( [ p[i-1][0]*p[i][1] - p[i][0]*p[i-1][1] for i in range(1, len(p)) ] ) return 0.5*np.abs(np.sum(s)) poly(np.array(polygon))
105 µs ± 931 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit @jit(nopython=True) def poly_numba(p): s = np.array( [ p[i-1][0]*p[i][1] - p[i][0]*p[i-1][1] for i in range(1, len(p)) ] ) return 0.5*np.abs(np.sum(s)) poly_numba(np.array(polygon))
151 ms ± 3.31 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
のとおり、通常の関数の方が早くなります。そのため、一回だけ関数を呼び出す場合は不利になります。 この例では10万回呼び出してようやくnumba.jitのほうが早くなります。
今回の例をpythonらしく書くと例えばzip関数を使って、
def poly(p): s = np.array( [ p0[0]*p1[1] - p1[0]*p0[1] for p1, p0 in zip(p[1:], p[:-1]) ] ) return 0.5*np.abs(np.sum(s))
と書けますがnumba.jitではエラーがでます。
numbaのupdateで徐々に使える関数が増えてますが 他にもnumpyやscipyの関数も使えないものが多いです。
関連記事
2020/2/1追記
いつの間にか修正されていました。もう普通に使えます。
Endpoints now throwing 500 errors · Issue #156 · maptiler/epsg.io · GitHub
のAPIが昨日から壊れているみたいです。
githubにはいくつかissuesが上がってました。
https://github.com/SciTools/cartopy/issues/1437
https://github.com/rhattersley/pyepsg/issues/15
matplolib,holoviews,geoviews等pythonの地図系のモジュールの多くで使われるcartopyモジュール内ではpyepsgモジュールを参照していますが、この中でepsg.ioのAPIが使われてます。
そのため、pythonでepsgを使った地図のレンダリングが全く使えません。
結構大事かなと思ったのですがほとんど情報がないです。
なんとかならないかな。。。
本年もよろしくお願いいたします。
本業が忙しくて全然書けおりませんが今年は更新頻度を上げたいです。
このブログ(勉強会)での今年中の目標は以下の3点。
小規模河床波上の流れのモデルの開発:鉛直二次元流
網状流路河道の自律的河床変動機構モデルの開発:平面二次元流
地域防災に資するwebアプリ開発
引き続きよろしくお願いいたします。