note.nkmk.me

AtCoderのPython, NumPy, SciPyのバージョンと注意点(2019年9月)

Date: 2019-09-19 / tags: Python, NumPy, SciPy

2019年9月時点でAtCoderで使用できるPython, NumPy, SciPyのバージョンおよびその注意点について以下の内容を説明する。

  • バージョンを確認するコード
  • 2019年9月時点でのバージョン
  • AtCoderにおけるPythonの注意点
    • 最大公約数gcd()mathではなくfractionsモジュール
    • f文字列は使えない
  • AtCoderにおけるNumPyの注意点
    • 最大公約数numpy.gcd(), 最小公倍数numpy.lcm()は使えない
  • AtCoderにおけるSciPyの注意点
    • 順列の総数scipy.special.perm()は使えない
    • 組み合わせの総数scipy.misc.comb()は使える
    • 最小全域木scipy.sparse.csgraph.minimum_spanning_tree()は使える
    • 連結成分scipy.sparse.csgraph.connected_components()は使える
    • 最短経路scipy.sparse.csgraph.shortest_path()は使える

2019年9月時点でのバージョンを先に書いておくと以下の通り。最新版から比べるとかなり古いバージョンとなっている。

Python: 3.4.3
NumPy:  1.8.2
SciPy:  0.13.3

以降、使用できる関数などの注意点を示すが、あくまでも、ある関数などが使える・使えないという情報であり、それを使ったほうがいいというわけではない。扱うデータのサイズなどの条件によっては自分で実装するなど他の手段のほうが実行時間やメモリ使用量が有利な場合もある。

また、すべての注意点を網羅しているわけではなく、同じ関数でもバージョンによって挙動が異なる場合もある。詳細は各項の冒頭に記載した該当バージョンの公式ドキュメントを参照されたい。

スポンサーリンク

バージョンを確認するコード

以下のコードをAtCoderのコードテストで実行するとPython本体およびNumPy, SciPyのバージョンが確認できる。

import platform
import numpy
import scipy

print('Python:', platform.python_version())
print('NumPy: ', numpy.__version__)
print('SciPy: ', scipy.__version__)

Python本体やNumPyはさらに詳細な情報を取得することも可能。

2019年9月時点でのバージョン

2019年9月時点での上記コードの実行結果は以下の通り。

Python: 3.4.3
NumPy:  1.8.2
SciPy:  0.13.3

AtCoderにおけるPythonの注意点

2019年9月時点でのAtCoderにおけるPython3のバージョンは3.4.3。公式ドキュメントは以下。

最大公約数gcd()はmathではなくfractionsモジュール

Python3.5以降は最大公約数を算出するgcd()関数がmathモジュールにあるが、それより前はfractionsモジュールにあった。

AtCoderはPython3.4.3なのでfractionsモジュール。

f文字列は使えない

そもそもAtCoderの問題でf文字列(f'...')を使いたくなる場面はあまりないかもしれないが、f文字列はPython3.6で追加された機能なのでAtCoder(Python3.4.3)では使えない。

書式指定をしたいときはformat()などを使う。

AtCoderにおけるNumPyの注意点

2019年9月時点でのAtCoderにおけるNumPyのバージョンは1.8.2

以下は1.8.1の公式ドキュメント。1.8.2でのアップデートはバグフィックスのみで機能追加はなし。

最大公約数numpy.gcd(), 最小公倍数numpy.lcm()は使えない

最大公約数を算出するnumpy.gcd(), 最小公倍数を算出するnumpy.lcm()が追加されたのはNumPy1.15.0。AtCoderはNumPy1.8.2なので使えない。

AtCoderにおけるSciPyの注意点

2019年9月時点でのAtCoderにおけるSciPyのバージョンは0.13.3

以下は0.13.0の公式ドキュメント。0.13.3までのアップデートはバグフィックスのみで機能追加はなし。

なお、SciPyのサブパッケージscipy.xxximport scipyだけだと読み込まれないので注意。

例えばimport scipyのあとでscipy.misc.comb()を実行するとエラーになる。

from scipy.xxx import 関数名として関数名()を実行するか、import scipy.xxxとしてscipy.xxx.関数名()を実行する必要がある。

順列の総数scipy.special.perm()は使えない

順列の総数を返すscipy.special.perm()はバージョン0.14.0で追加された。AtCoderはSciPy0.13.3なので使えない。

組み合わせの総数scipy.misc.comb()は使える

組み合わせの総数を返すscipy.special.comb()もバージョン0.14.0で追加された関数だが、それより前のバージョンではscipy.misc.comb()として使える。AtCoderはSciPy0.13.3なのでscipy.misc.comb()が使える。

最小全域木scipy.sparse.csgraph.minimum_spanning_tree()は使える

グラフの最小全域木を返すscipy.sparse.csgraph.minimum_spanning_tree()はバージョン0.11.0で追加された関数。AtCoderで使える。

連結成分scipy.sparse.csgraph.connected_components()は使える

グラフの連結成分の個数などを返すscipy.sparse.csgraph.connected_components()もバージョン0.11.0で追加された関数。AtCoderで使える。

最短経路scipy.sparse.csgraph.shortest_path()は使える

グラフの最短経路を返すscipy.sparse.csgraph.shortest_path()もバージョン0.11.0で追加された関数。AtCoderで使える。

ただし、バージョン0.13.3時点のscipy.sparse.csgraph.shortest_path()には引数indicesが無いため、常にすべての頂点間の最短経路が算出される。

ダイクストラ法scipy.sparse.csgraph.dijkstra()やベルマンフォード法scipy.sparse.csgraph.bellman_ford()といった各アルゴリズムの関数では引数indicesを指定可能。scipy.sparse.csgraph.shortest_path()ではなく各アルゴリズムの関数を明示的に指定したほうがよい。

scipy.sparse.csgraph.shortest_path()scipy.sparse.csgraph.dijkstra()などの詳細は以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事