web-dev-qa-db-ja.com

python.arrayとnumpy.array

Pythonで1D配列を作成している場合、NumPyパッケージを使用する利点はありますか?

49
Hortitude

それはすべて、アレイで何をする予定かによって異なります。単純なデータ型の配列を作成してI/Oを実行するだけの場合は、 array モジュールで問題ありません。

一方、何らかの数値計算を実行したい場合、配列モジュールはそれを支援しません。 NumPy (および SciPy )は、配列と特殊関数の間のさまざまな操作を提供します。これらは、科学的な作業だけでなく、高度な画像操作などの一般的なものにも役立ちます。大量のデータを使用して効率的な計算を実行する必要がある場合。

Numpyは、はるかに柔軟性もあります。あらゆるタイプのPythonオブジェクトの配列をサポートし、 配列インターフェイス に準拠している場合は、独自のオブジェクトと「ネイティブに」対話することもできます。

64
dF.

これが役立つと思う人のための小さなブートストラップ(@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を選択することは悪い選択ではありません(正しく使用されている場合)。

2
nivniv