H

Matplotlibのplotに対する偏見

 みんなはそうではないかもしれないけど、今まで自分の中には、Matplotlibのplot()は等差配列的なものしか受け入れてくれない、という偏見があった。実際に多くのチュートリアルでは、

x = numpy.arange(-5, 5, 0.01)

とか、

x = numpy.linspace(-5, 5, 100)

みたいにしてから、

y = x ** 2

のようにするコードが多いし、自分の偏見でコーディングする癖も相まって、公式ドキュメントなんで読む機会は確保していなかったから、ずっと何かこう等差配列しか受け入れてくれないのかなって思っていた。
 言い訳になるけど、新しい言語を始めるときに、参考にするチュートリアルの書き方を真似てコーディングをする、なんて事あるし――それに車輪の再発明は新しい言語を学ぶのに必要なことじゃん。むしろその車輪を如何に拡張していくか、という点が非常に重要なのであって、とにかく、なかなか公式ドキュメントを読む機会ってのは少ないと思うんだ。

 まあその話は置くとして、そんな自分の偏見が打ち砕かれたのはつい最近の事。Pythonで円を書こうって思ってぐぐった時に、初めて知ったんだよね。
高校二年生ぐらいで習うと思うけど、円の式ってこんな感じじゃん。
x^2 + y^2 = r^2
それでさ、今まで慣れていた書き方(二次関数とかsin波とか)とは大きく違うわけで、こんなん書けるわけないよって感じになったんだよね。
 あ、ちなみに↑の式はデカルト座標のもので、極座標になるといくらかマシになるんだよね。
 R = r
まあ変数が似たようなのは勘弁して。
 
 あるサイトによると、円はRとsin、cos、\thetaを用いて書けるらしいのね。まあ媒介変数ってやつなんだけど。
それみて、「WTF!!!」って思って、改めて公式ドキュメント見てみたら、等差配列を入力しろなんて書いてないんだよね。

ずっと等差配列の入力が必要だと思ってました。以上!!!

急がず,だが休まずに

文学界における著名な作家であるシェークスピアは,生前,このような言葉を残した。
――without haste, but without rest.
この言葉の意味は,「急がず,だが休まずに」とか「休まず,しかしゆっくりと」的な,そのままのものとなっている。

さて,最近勉強垢というものを初めてみたものの,一日10時間とか勉強している人を見ると,焦ってしまう気持ちが生まれてしまう。
しかしながら,この言葉通り,自分の身の丈に合った進め方をしていきたいものである。

とち狂った首相

 日本は民主主義の国ですが、ある日、よくわからん指導者の口車に乗せられて、よくわからん議員を選出してしまう事があります。その議員は、よくわからん首相を選出します。
 ある時、そのよくわからん首相は何をとち狂ったのか、突然こう言いました。
「そうだ、消費税を外貨にしよう。消費税の円の10%相当のドルを、納税させよう」と。
為替レートを見てみると、1ドル115.68円でした。
ある人は、ある商品に対する納税額を割り出すために、ある方法を用いました。ただしある商品の値段をX円とします。

\frac{1}{10}\frac{115.68}{1}X = \frac{115.68}{10}X
この式における、\frac{115.68}{1}換算係数といいます。そして、ある方法は、次元解析と呼ばれるものでした。
こうして、ある人が用いた次元解析により人々は幸せに暮らしましたとさ。めでたしめでたし。
ちなみに、為替市場は変化する事を考慮しなかった末に起こった悲劇は、また別のお話。

C++でモンテカルロ法

パワープレイの実装
モンテカルロ法についてはこちらを参照
ja.wikipedia.org

コード

#include <iostream>
#include <math.h>
#include <random>

float epoc(int v){
    float x[v];
    float y[v];

    for(int i=0;i<v;i++){
        x[i] = (float)rand()/RAND_MAX;
        y[i] = (float)rand()/RAND_MAX;
    }

    float r;
    int cnt = 0;
    float n;

    for(int i=0;i<v;i++){
        n = (float)sqrt(pow(x[i], 2) + pow(y[i], 2));
        if(n < 1){
            cnt = cnt + 1;
        }
    }

    r = (float)4 * cnt / v;
    return r;
}

int main(){

    int n;
    std::cin >> n;

    std::cout << epoc(n) << std::endl;

    return 0;
}

標準入力で制御できるようにした。

結果:
200000のとき……3.13908

C++始めたてだから乱数あってないかもね。

開発におけるPythonの位置づけ

 開発現場においてPythonは忌み嫌われる言語、といっても差し支えありません。実際の所Pythonがここまで人気なのは、Python自体の能力というよりGoogle colaboratoryといった手軽に開発できる環境と、NumPyやScipy、scikit-learn等の外部ライブラリの充実さにあります。
 Pythonはその特性(手軽さ)の影響もあり、動作は基本的に遅いです。ではPythonをどのような位置づけにすべきでしょうか。

 結論から言うと私としては、ハブ的な用途が一番だと考えています。
 先述の通り、Pythonは外部ライブラリが充実しています。この外部ライブラリは、多くの場合C++といった別言語で書かれている事が多いです。少なくともPythonフルスクラッチなんてライブラリは私は見たことがないですね。
 一般的に、Pythonは純粋なものよりもライブラリを駆使したほうが高速といわれています。それを裏付けるかのように、有名なNumPyはC、scikit-learnもC++とCで書かれています。(一ミリぐらいはPythonが使われてたりしますが)なので、基本的なPythonの開発指針は、フルスクラッチで書く、というよりも外部ライブラリを使っていく、という風になります。

 そしてライブラリは、何もスーパーハカーのみが作れる、というわけでもありません。一般人もライブラリやモジュールを自作できます。
 さらにPythonは有能な事に、多くの言語との呼び出しの関係を作れます。つまりC言語で作ったモジュールをPythonで呼び出したり、あるいはGoやRustでもなんでも、そういう言語に主要な処理をまかせて、管理はPythonを駆使し、便利なPythonのライブラリと組み合わせて開発していく。そういう事ができるわけです。
 
 まあまとめると、Pythonは高速化と開発速度の向上に役立つので、ハブ的に使うべきだということですね。