Pythonで1D配列を作成している場合、NumPyパッケージを使用する利点はありますか?
それはすべて、アレイで何をする予定かによって異なります。単純なデータ型の配列を作成してI/Oを実行するだけの場合は、 array モジュールで問題ありません。
一方、何らかの数値計算を実行したい場合、配列モジュールはそれを支援しません。 NumPy (および SciPy )は、配列と特殊関数の間のさまざまな操作を提供します。これらは、科学的な作業だけでなく、高度な画像操作などの一般的なものにも役立ちます。大量のデータを使用して効率的な計算を実行する必要がある場合。
Numpyは、はるかに柔軟性もあります。あらゆるタイプのPythonオブジェクトの配列をサポートし、 配列インターフェイス に準拠している場合は、独自のオブジェクトと「ネイティブに」対話することもできます。
これが役立つと思う人のための小さなブートストラップ(@dFによる優れた回答に続く):
import numpy as np
from array import array
# Fixed size numpy array
def np_fixed(n):
q = np.empty(n)
for i in range(n):
q[i] = i
return q
# Resize with np.resize
def np_class_resize(isize, n):
q = np.empty(isize)
for i in range(n):
if i>=q.shape[0]:
q = np.resize(q, q.shape[0]*2)
q[i] = i
return q
# Resize with the numpy.array method
def np_method_resize(isize, n):
q = np.empty(isize)
for i in range(n):
if i>=q.shape[0]:
q.resize(q.shape[0]*2)
q[i] = i
return q
# Array.array append
def arr(n):
q = array('d')
for i in range(n):
q.append(i)
return q
isize = 1000
n = 10000000
出力は次のようになります。
%timeit -r 10 a = np_fixed(n)
%timeit -r 10 a = np_class_resize(isize, n)
%timeit -r 10 a = np_method_resize(isize, n)
%timeit -r 10 a = arr(n)
1 loop, best of 10: 868 ms per loop
1 loop, best of 10: 2.03 s per loop
1 loop, best of 10: 2.02 s per loop
1 loop, best of 10: 1.89 s per loop
Array.arrayの方が少し高速で、「api」を使用すると手間が省けるようですが、doubleを格納するだけでは不十分な場合は、numpy.resizeを選択することは悪い選択ではありません(正しく使用されている場合)。