2015-03-18 12 views
8

Einige Beispiele:Warum hat numpy für viele ndarray-Methoden eine entsprechende Funktion?

numpy.sum() 
ndarray.sum() 
numpy.amax() 
ndarray.max() 
numpy.dot() 
ndarray.dot() 

... und nicht wenige mehr. Ist es die Unterstützung von Legacy-Code oder gibt es einen besseren Grund dafür? Und, wähle ich nur auf der Grundlage, wie mein Code "aussieht", oder ist einer der beiden Wege besser als der andere?

kann ich mir vorstellen, dass man numpy.dot() wollen könnte reduce (z.B. reduce(numpy.dot, A, B, C, D)) verwenden, aber ich glaube nicht, dass wie numpy.sum() als nützlich für etwas sein würde.

+0

In den meisten Fällen ist die Funktion Version endet Aufruf der Methode Version (gebunden an das erste Argument) verwendet wird. Aber die Funktion kann das längere 'doc' haben. Für den Benutzer ist es meist eine Frage des Stils. – hpaulj

+2

Siehe auch diese Ausgabe: https://github.com/numpy/numpy/issues/7452. Es scheint, dass die numpigen Entwickler es vorziehen, die Methodensyntax zu entfernen, jedoch nicht, weil sie Abwärtskompatibilität aufrechterhalten müssen. Persönlich würde ich bevorzugen, dass es nur konsistent gemacht wird, so dass alle Funktionen als Methoden und nicht als einige wenige aufgerufen werden können. – Peter

Antwort

6

Wie andere bemerkt haben, sind die gleichnamigen NumPy-Funktionen und Array-Methoden oft äquivalent (sie rufen am Ende den gleichen zugrunde liegenden Code auf). Man könnte gegenüber dem anderen bevorzugt werden, wenn es das Lesen erleichtert.

In einigen Fällen verhalten sich die beiden jedoch etwas anders. Insbesondere betont die Verwendung der ndarray-Methode manchmal die Tatsache, dass die Methode das Array an Ort und Stelle modifiziert.

Zum Beispiel gibt np.resize ein neues Array mit der angegebenen Form zurück. Auf der anderen Seite ändert ndarray.resize die Form des Arrays in-Place. Die jeweils verwendeten Füllwerte sind ebenfalls unterschiedlich.

In ähnlicher Weise sortiert a.sort() das Array a an Ort und Stelle, während np.sort(a) eine sortierte Kopie zurückgibt.

+0

Mhhh ... Nicht sicher über "np.resize" vs. "ndarray.resize", scheinen beide zu funktionieren. Ich habe gerade versucht, und wenn ich etwas wie "C = np.reshape (A, (1,5))", dann "C [0,3] = 100" mache, finde ich, dass sich auch "A" geändert hat. (Ich bin auf Python 3.4, numpy 1.9.2.) – Roberto

+0

@Roberto: Verwenden Sie 'resize' oder' reshape'? Sie sind völlig unterschiedliche Funktionen - "ndarray.rehsape" und "np.reshape" geben beide eine neue Ansicht eines Arrays zurück. 'resize' kann die tatsächliche Größe eines Arrays im Speicher anpassen und bei Bedarf mehr zuweisen. –

+0

Oh Gott, es ist einer dieser Tage. :) Ja, ich weiß nicht, warum ich die beiden vermische. Wahrscheinlich, weil beide mit 're' beginnen. – Roberto

4

In den meisten Fällen ist die Methode die grundlegende kompilierte Version. Die Funktion verwendet diese Methode, wenn sie verfügbar ist, hat aber auch eine Art von Sicherung, wenn das Argument kein Array ist. Es hilft, den Code und/oder die Dokumente der Funktion oder Methode zu betrachten.

Zum Beispiel, wenn in Ipython Ich bitte um die Summe Methode auf den Code zu sehen, ich sehe, dass es Code kompiliert wird

In [711]: x.sum?? 
Type:  builtin_function_or_method 
String form: <built-in method sum of numpy.ndarray object at 0xac1bce0> 
... 
Refer to `numpy.sum` for full documentation. 

das gleiche tun auf np.sum ich viele Zeilen Dokumentation sowie einige Python-Code erhalten : Wenn ich np.sum(x)

if isinstance(a, _gentype): 
     res = _sum_(a) 
     if out is not None: 
      out[...] = res 
      return out 
     return res 
    elif type(a) is not mu.ndarray: 
     try: 
      sum = a.sum 
     except AttributeError: 
      return _methods._sum(a, axis=axis, dtype=dtype, 
           out=out, keepdims=keepdims) 
     # NOTE: Dropping the keepdims parameters here... 
     return sum(axis=axis, dtype=dtype, out=out) 
    else: 
     return _methods._sum(a, axis=axis, dtype=dtype, 
          out=out, keepdims=keepdims) 

nennen, wo x ein Array ist, endet es bis Aufruf x.sum():

sum = a.sum 
    return sum(axis=axis, dtype=dtype, out=out) 

np.amax ähnlich (aber einfacher). Beachten Sie, dass das Formular np. ein Objekt behandeln kann, das kein Array ist (das die Methode nicht hat), z. eine Liste: np.amax([1,2,3]).

np.dot und beide als "eingebaute" Funktion, so können wir nichts über die Priorität sagen. Wahrscheinlich rufen beide am Ende eine C-Funktion auf.

np.reshape ist eine andere, die deligates wenn möglich:

try: 
    reshape = a.reshape 
except AttributeError: 
    return _wrapit(a, 'reshape', newshape, order=order) 
return reshape(newshape, order=order) 

So np.reshape(x,(2,3)) in der Funktionalität x.reshape((2,3)) identisch ist. Aber der Ausdruck _wrapit ermöglicht np.reshape([1,2,3,4],(2,2)).

np.sort gibt eine Kopie von einer Inplace-Art auf einer Kopie zu tun:

a = asanyarray(a).copy() 
a.sort(axis, kind, order) 
return a 

x.resize ist eingebaut, während np.resize endet eine np.concatenate und reshape tun up.

Wenn Ihr Array eine Unterklasse ist, wie Matrix oder maskiert, kann es eine eigene Variante haben. Die Wirkung einer Matrix .sum ist:

return N.ndarray.sum(self, axis, dtype, out, keepdims=True)._collapse(axis) 
+1

TIL über '??' in ipython – acushner

+0

In 'Ipython',' '' bedeutet mir das doc zeigen, '??' zeigen Sie mir den Code. Es ist ein praktisches Werkzeug für Code-Introspektion. Und '. 'listet mögliche Vervollständigungen auf. – hpaulj

+0

Danke, das '??' ist wirklich sehr nützlich! – Roberto

0

auf für Sichtbarkeit Peters Kommentar Ausarbeiten:

Wir haben es durch Entfernen von Methoden aus ndarray konsistenter machen könnte und das Festhalten nur Funktionen. Aber das ist unmöglich, weil es den vorhandenen Code, der Methoden verwendet, durchbrechen würde.

Oder wir könnten alle Funktionen auch zu Methoden machen. Dies ist jedoch nicht möglich, da neue Benutzer und Pakete ständig neue Funktionen definieren. Darüber hinaus verstößt die weitere Multiplikation dieser doppelten Methoden gegen "es sollte einen offensichtlichen Weg geben, dies zu tun".

Wenn wir in der Zeit zurückgehen könnten, dann würde ich wahrscheinlich dafür argumentieren, diese Methoden überhaupt nicht auf ndarray anzuwenden und ausschließlich Funktionen zu verwenden. ... So all dies spricht für Funktionen ausschließlich

numpy issue: More consistency with array-methods #7452

Verwandte Themen