2008-09-21 5 views

Antwort

49

Es hängt alles davon ab, was Sie mit dem Array machen wollen. Wenn Sie nur Arrays einfacher Datentypen erstellen und I/O-Operationen ausführen, wird das array-Modul problemlos funktionieren.

Wenn Sie jedoch irgendeine Art von numerischen Berechnungen durchführen möchten, bietet das Array-Modul keine Hilfe. NumPy (und SciPy) bieten Ihnen eine Vielzahl von Operationen zwischen Arrays und speziellen Funktionen, die nicht nur für wissenschaftliche Arbeiten nützlich sind, sondern auch für fortgeschrittene Bildmanipulationen oder allgemein für alles, was Sie für effiziente Berechnungen mit großen Datenmengen benötigen.

Numpy ist auch viel flexibler, z.B. Es unterstützt Arrays jeder Art von Python-Objekten und kann auch "nativ" mit eigenen Objekten interagieren, wenn sie der array interface entsprechen.

+7

In Verteidigung von array.array, ich denke, es ist wichtig zu beachten, dass es auch viel leichter als numpy.array ist, und das Sprichwort 'wird gut' für ein 1D-Array sollte wirklich 'viel schneller sein, kleiner und arbeitet ohne Probleme in Pypy/Cython. ' Ich liebe NumPy, aber für einfache Arrays ist das array.array Modul eigentlich besser. –

+1

@ J.J nie ein Array.array in meinem Leben verwendet, würde es Ihnen etwas ausmachen, einen Anwendungsfall zu geben, wenn es sinnvoll besser ist (vielleicht übernehme ich np.darray)? – VF1

+0

@ dF. Die Verbindung zum Array-Modul ist inaktiv. Kennst du seinen neuen Standort? – Karlo

1

Kleine Bootstrapping zum Nutzen wer auch immer diese nützlich finden könnten (im Anschluss an die ausgezeichnete Antwort von @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 

Der Ausgang gibt:

%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 

Es scheint, dass array.array ist etwas schneller und die 'api' erspart Ihnen einige Schwierigkeiten, aber wenn Sie mehr als nur das Speichern von Doppel brauchen, dann ist numpy.resize keine schlechte Wahl (bei korrekter Verwendung).