Tipps zum Golfen mit Numpy, Scipy oder Pylab

10

Es gibt bereits eine umfassende Liste von Tipps für Python hier , so , was ich frage , Tipps sind, die mit den speziell gelten numpy, scipyoder pylabBibliotheken.

Dies können entweder Möglichkeiten sein, bereits verwendeten Code zu verkürzen numpy, oder Möglichkeiten, allgemeine Python-Operationen mithilfe dieser Bibliotheken zu verkürzen.

Ein Tipp pro Antwort bitte.

user2699
quelle
Beachten Sie, dass dies pylabnur matplotlib.pyplot+ numpyin einem veralteten allgemeinen Namespace ist. Der numpyTeil von pylabist in dem Sinne trivial, dass ihre Importe die gleiche Anzahl von Bytes haben, so dass zusätzlich nur Plotmaterial stammen könnte pylab, aber ich vermute, dass Sie dies bei Ihrer Frage nicht im Sinn hatten.
Andras Deak
2
@AndrasDeak, ich bin mir bewusst, dass die Verwendung von Pylab als schlechte Praxis angesehen wird, aber sehr wenig in Codegolf kann als gute Praxis angesehen werden. Pylab enthält direkt Teile vieler numpyPakete. Zum Beispiel pylab.randintist gültig, wo numpy erfordern würde numpy.random.randint. Zum Golfen pylabsollte also kürzerer Code angegeben werden.
user2699
1
Ich bin mir bewusst, dass Abwertung kein Problem ist. Mein Punkt war, dass es auch keinen Vorteil bringt. Ich wusste einfach nicht, dass Unterpakete auch so in den Pylab-Namespace geladen wurden! Tut mir leid, du hast vollkommen recht :)
Andras Deak

Antworten:

5

Nutzen Sie Numpys Rundfunk

Broadcasting bedeutet, ein mehrdimensionales Array entlang einiger seiner Singleton-Dimensionen zu replizieren, um es an die Größe eines anderen Arrays anzupassen. Dies geschieht automatisch für Numpy-Arrays, wenn arithmetische Operatoren auf sie angewendet werden.

Um beispielsweise eine 10 × 10-Multiplikationstabelle zu generieren, können Sie diese verwenden

import numpy
t=numpy.arange(1,11)
print(t*t[:,None]) # Or replace t[:,None] by [*zip(t)]

Probieren Sie es online aus!

Hier twird als Numpy-Array erstellt [1, 2, ..., 10]. Dies hat die Form (10,), die (1,10) entspricht. Das andere Operandenarray t[:,None]hat die Größe (10,1). Durch Multiplizieren der beiden Arrays werden sie implizit repliziert, sodass sie sich so verhalten, als hätten beide eine Form (10, 10). Das Ergebnis, das ebenfalls die Form (10,10) hat, enthält die Produkte für alle Eintragspaare in den ursprünglichen Arrays.

Luis Mendo
quelle
Das war eine kluge Verwendung des zipRundfunks. Wird das in seiner eigenen Antwort auftauchen?
user2699
@ user2699 Ich denke nicht, dass es eine separate Antwort wert ist, da [*zip(t)]es die gleiche Anzahl von Bytes hat wie die besser lesbare t[:,None]. Aber Sie haben Recht, es kann erwähnenswert sein, also habe ich es hier wieder hinzugefügt
Luis Mendo
Guter Punkt, ich glaube, ich habe die Bytes nicht wirklich gezählt. [*zip(t)]wäre zwei Bytes kürzer, wenn es mehr Dimensionen gäbe.
user2699
1
Beachten Sie, dass das erweiterte iterierbare Entpacken [*zip(t)]nur unter Python 3 funktioniert.
Andras Deak
Ich habe diese Seite angesehen, da ich daran interessiert bin herauszufinden, welche Zahl Perl 6 nicht hat. Wie auch immer, das würde so geschrieben werden, wie my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]Sie es könntenzip(t)
Brad Gilbert b2gills
2

Verwenden Sie r _ [...] anstelle von range (...)

Numpy bietet eine Matlab-ähnliche Syntax für die Array-Erstellung mit r_[...]. Jede Slice-Notation zwischen den Klammern wird als Array mit dem angegebenen Bereich interpretiert. So zum Beispiel

r_[:30:4]

ist äquivalent zu

arange(0,30,4)

und für die meisten Anwendungen kann ersetzen

range(0,30 4)

Es kann auch komplexere Ausdrücke verarbeiten. Zum Beispiel, um Indizes von 0 bis 10 zu erhalten und wieder zurück zu gehen,

r_[:10,10:-1:-1]
user2699
quelle