Conseils pour jouer au golf avec numpy, scipy ou pylab

10

Il existe déjà une liste complète d'astuces pour python ici , donc ce que je demande, ce sont des astuces qui s'appliquent spécifiquement à l'utilisation de numpy, scipyou des pylabbibliothèques.

Il peut s'agir soit de raccourcir le code déjà utilisé numpy, soit de raccourcir les opérations python courantes en utilisant ces bibliothèques.

Un conseil par réponse, s'il vous plaît.

user2699
la source
Notez que pylabest juste matplotlib.pyplot+ numpydans un espace de noms commun dépréciée. La numpypartie de pylabest triviale dans le sens où leurs importations ont le même nombre d'octets, donc seuls les tracés pourraient en plus provenir pylab, mais je suppose que ce n'est pas ce que vous aviez en tête avec votre question.
Andras Deak
2
@AndrasDeak, je suis conscient que l'utilisation de pylab est considérée comme une mauvaise pratique, mais très peu de codegolf peut être considéré comme une bonne pratique. Pylab inclut directement des parties de nombreux numpypackages. Par exemple, pylab.randintest valide là où numpy aurait besoin numpy.random.randint. Donc, pour le golf pylabdevrait fournir un code plus court.
user2699
1
Je suis conscient que la dépréciation n'est pas un problème, mon point de vue était que cela ne donne pas non plus d'avantage. Je ne savais tout simplement pas que des sous-paquets étaient également chargés dans l'espace de noms pylab comme ça! Alors désolé, vous avez parfaitement raison :)
Andras Deak

Réponses:

5

Profitez de la diffusion de Numpy

La diffusion signifie la réplication d'un tableau multidimensionnel le long de certaines de ses dimensions singleton pour correspondre à la taille d'un autre tableau. Cela se produit automatiquement pour les tableaux Numpy lorsque des opérateurs arithmétiques leur sont appliqués.

Par exemple, pour générer une table de multiplication 10 × 10, vous pouvez utiliser

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

Essayez-le en ligne!

Ici test créé en tant que tableau Numpy [1, 2, ..., 10]. Cela a la forme (10,), ce qui équivaut à (1,10). L'autre tableau d'opérandes,, t[:,None]a une taille (10,1). La multiplication des deux tableaux les réplique implicitement, de sorte qu'ils se comportent comme s'ils avaient tous deux une forme (10,10). Le résultat, qui a également une forme (10,10), contient les produits pour toutes les paires d'entrées dans les tableaux d'origine.

Luis Mendo
la source
C'était une utilisation intelligente de zipla radiodiffusion, cela va-t-il apparaître dans sa propre réponse?
user2699
@ user2699 Je ne pense pas que cela mérite une réponse distincte, car [*zip(t)]a le même nombre d'octets que le plus lisible t[:,None]. Mais vous avez raison, cela vaut peut-être la peine d'être noté, alors je l'ai ajouté ici
Luis Mendo
Bon point, je suppose que je n'ai pas réellement compté les octets. [*zip(t)]serait de deux octets plus court s'il y avait plus de dimensions.
user2699
1
Notez que le déballage itérable étendu [*zip(t)]ne fonctionnera que sur python 3.
Andras Deak
J'ai consulté cette page car je suis intéressé à découvrir ce que numpy a que Perl 6 n'a pas. Quoi qu'il en soit qui serait écrit comme my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]ou que vous pourriez utiliserzip(t)
Brad Gilbert b2gills
2

Utilisez r _ [...] au lieu de range (...)

Numpy fournit une syntaxe de type matlab pour la création de tableaux à l'aide de r_[...]. Toute notation de tranche entre les crochets est interprétée comme un tableau avec la plage indiquée. Ainsi, par exemple

r_[:30:4]

est équivalent à

arange(0,30,4)

et pour la plupart des utilisations peut remplacer

range(0,30 4)

Il peut également gérer des expressions plus complexes. Par exemple, pour obtenir des indices de 0 à 10 et redescendre,

r_[:10,10:-1:-1]
user2699
la source