Consejos para jugar al golf con numpy, scipy o pylab

10

Ya hay una lista completa de consejos para pitón aquí , así que lo que estoy pidiendo son consejos que se aplican específicamente a la utilización de los numpy, scipyo pylabbibliotecas.

Estas pueden ser formas de acortar el código que ya está usando numpy, o formas de acortar las operaciones comunes de Python usando estas bibliotecas.

Un consejo por respuesta, por favor.

usuario2699
fuente
Tenga en cuenta que pylabes solo matplotlib.pyplot+ numpyen un espacio de nombres común en desuso. La numpyparte de pylabes trivial en el sentido de que sus importaciones tienen el mismo número de bytes, por lo que solo podría trazar cosas adicionales pylab, pero sospecho que eso no es lo que tenía en mente con su pregunta.
Andras Deak
2
@AndrasDeak, soy consciente de que usar pylab se considera una mala práctica, pero muy poco en codegolf se puede considerar una buena práctica. Pylab incluye directamente partes de muchos numpypaquetes. Por ejemplo, pylab.randintes válido donde lo requiera numpy numpy.random.randint. Entonces, para el golf pylabdebe proporcionar un código más corto.
user2699
1
Soy consciente de que la desaprobación no es un problema, mi punto era que tampoco da una ventaja. ¡Simplemente no me di cuenta de que los subpaquetes también se cargaron en el espacio de nombres de Pylab así! Lo siento, tienes toda la razón :)
Andras Deak

Respuestas:

5

Haz uso de la transmisión de Numpy

Transmitir significa replicar una matriz multidimensional a lo largo de algunas de sus dimensiones singleton para que coincida con el tamaño de otra matriz. Esto sucede automáticamente para las matrices Numpy cuando se les aplican operadores aritméticos.

Por ejemplo, para generar una tabla de multiplicación de 10 × 10 puede usar

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

Pruébalo en línea!

Aquí tse crea como la matriz de Numpy [1, 2, ..., 10]. Esto tiene forma (10,), que es equivalente a (1,10). La otra matriz de operandos t[:,None], tiene tamaño (10,1). Multiplicar las dos matrices las replica implícitamente, por lo que se comportan como si ambas tuvieran forma (10,10). El resultado, que también tiene forma (10,10), contiene los productos para todos los pares de entradas en las matrices originales.

Luis Mendo
fuente
Ese fue un uso inteligente de zipla transmisión, ¿va a surgir en su propia respuesta?
user2699
@ user2699 No creo que valga una respuesta por separado, porque [*zip(t)]tiene el mismo número de bytes que el más legible t[:,None]. Pero tienes razón, vale la pena señalar, así que lo agregué aquí
Luis Mendo
Buen punto, supongo que en realidad no conté los bytes. [*zip(t)]sería dos bytes más corto si hubiera más dimensiones.
usuario2699
1
Tenga en cuenta que el desempaquetado iterable extendido [*zip(t)]solo funcionará en Python 3.
Andras Deak
Vi esta página porque estoy interesado en descubrir qué tiene Numpy que Perl 6 no tiene. De todos modos, eso se escribiría my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]o podría usarzip(t)
Brad Gilbert b2gills
2

Utilice r _ [...] en lugar de rango (...)

Numpy proporciona una sintaxis similar a matlab para la creación de matrices usando r_[...]. Cualquier notación de corte entre paréntesis se interpreta como una matriz con el rango indicado. Entonces, por ejemplo

r_[:30:4]

es equivalente a

arange(0,30,4)

y para la mayoría de los usos puede reemplazar

range(0,30 4)

También puede manejar expresiones más complejas. Por ejemplo, para obtener índices de 0 a 10 y volver a bajar,

r_[:10,10:-1:-1]
usuario2699
fuente