通常のPythonリストに比べて NumPy の利点は何ですか?
私は約100の金融市場シリーズを持ち、100×100×100 = 100万セルの立方体配列を作成します。標準誤差で配列を埋めるために、各xを各yおよびzで(3変数)回帰させます。
パフォーマンスとスケーラビリティの観点から、「大きな行列」の場合はPythonリストとは対照的にNumPyを使用する必要があると聞きました。つまり、私はPythonのリストを知っていて、それらは私のために働くようです。
NumPyに移行した場合、どのようなメリットがありますか?
1000個のシリーズ(つまり、キューブ内に10億個の浮動小数点セル)がある場合はどうなりますか?
NumPyの配列はPythonのリストよりもコンパクトです - Pythonで記述したリストのリストは少なくとも20 MBほどかかりますが、セルに単精度浮動小数点数を含むNumPy 3D配列は4 MBに収まります。アイテムを読み書きする際のアクセスもNumPyの方が速いです。
たぶんあなたはたった百万セルのためにそれほど気にしないかもしれません、しかしあなたは間違いなく10億セルのためにします - どちらのアプローチも32ビットアーキテクチャに適合しません、しかし64ビットビルドでPythonだけでも最低でも12 GB(サイズが2倍になるポインタがたくさん)必要になるでしょう - はるかに高価なハードウェアです!
違いは主に「間接性」によるものです。PythonリストはPythonオブジェクトへのポインタの配列です。少なくともポインタあたり4バイト、さらに最小のPythonオブジェクト用に16バイト(型ポインタ用に4、参照カウント用に4、4値のために - そしてメモリアロケータは16まで切り上げます)。 NumPy配列は一様な値の配列です - 単精度の数値はそれぞれ4バイト、倍精度の数値は8バイトです。それほど柔軟ではありませんが、標準のPythonリストの柔軟性のためにかなりのお金を払っています。
NumPyは単に効率的ではありません。それはまたもっと便利です。あなたは無料でたくさんのベクトルと行列演算を手に入れます。そしてそれらも効率的に実装されています。
たとえば、立方体をファイルから配列に直接読み込むことができます。
x = numpy.fromfile(file=open("data"), dtype=float).reshape((100, 100, 100))
2次元に沿って合計します。
s = x.sum(axis=1)
どのセルがしきい値を超えているかを調べます。
(x > 0.5).nonzero()
3次元に沿ってすべての偶数インデックススライスを削除します。
x[:, :, ::2]
また、多くの便利なライブラリがNumPy配列で動作します。たとえば、統計分析および視覚化ライブラリです。
パフォーマンスに問題がない場合でも、NumPyを学ぶことは価値があります。
アレックスはメモリ効率について言及しました、そして、ロベルトは便利さについて言及します、そしてこれらは両方とも良い点です。さらにいくつかのアイデアについては、speedとfunctionsに言及します。
機能性:NumPy、FFT、畳み込み、高速検索、基本統計、線形代数、ヒストグラムなどを使用して、多くの機能が組み込まれています。そして、FFTなしで生きられる人はいますか?
速度:これはリストとNumPy配列の合計を計算するテストです。NumPy配列の合計が10倍高速であることがわかります(このテストではマイレージが異なる場合があります)。
from numpy import arange
from timeit import Timer
Nelements = 10000
Ntimeits = 10000
x = arange(Nelements)
y = range(Nelements)
t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
print("numpy: %.3e" % (t_numpy.timeit(Ntimeits)/Ntimeits,))
print("list: %.3e" % (t_list.timeit(Ntimeits)/Ntimeits,))
これは私のシステムでは(私がバックアップを実行している間に)与える:
numpy: 3.004e-05
list: 5.363e-04
これは、 scipy.org Webサイト のFAQからのいい答えです。
NumPy配列は(入れ子になった)Pythonリストに比べてどんな利点がありますか?
Pythonのリストは効率的な汎用コンテナです。それらは(かなり)効率的な挿入、削除、追加、そして連結をサポートし、そしてPythonのリスト内包表記はそれらを構築しそして操作することを容易にします。ただし、要素ごとの加算や乗算などの「ベクトル化」演算はサポートされていません。また、異なる型のオブジェクトを含めることができるという事実は、Pythonがすべての要素の型情報を格納し、型ディスパッチコードを実行する必要がある各要素を操作するとき。これはまた、効率的なCループで実行できるリスト操作が非常に少ないことを意味します。各反復には型チェックやその他のPython APIブックキーピングが必要です。
Timeseries scikitsにNumPyに基づくtimeseriesのサポートがあることにも注意してください。
http://pytseries.sourceforge.net
回帰のために、100 ^ 3の問題に対しても、NumPyがリストより桁違いに速く便利になると確信しています。
すべてがnumpy配列とpythonリストの間のほとんどすべての主な違いを強調しています。ここでそれらについて簡単に説明します。
(動的に大きくなる可能性がある)pythonリストとは異なり、Numpy配列は作成時に固定サイズを持ちます。 ndarrayのサイズを変更すると、新しい配列が作成され、元の配列が削除されます。
Numpy配列の要素はすべて同じデータ型である必要があり(異種型でも可能ですが、数学的演算を許可しないため)、メモリ内で同じサイズになります
Numpy配列は、多数のデータに対する数学的およびその他の種類の演算を容易にします。通常、このような操作は、pythons build sequenceを使用して可能であるよりも効率的に、より少ないコードで実行されます。