Suggerimenti per giocare a golf con numpy, scipy o pylab


10

C'è già una lista completa di consigli per Python qui , quindi quello che sto chiedendo sono suggerimenti che si applicano specificamente all'utilizzo dei numpy, scipyo pylablibrerie.

Questi possono essere sia modi per abbreviare il codice già in uso numpy, sia modi per abbreviare le operazioni comuni di Python usando queste librerie.

Un consiglio per risposta, per favore.


Si noti che pylabè solo matplotlib.pyplot+ numpyin uno spazio dei nomi comune deprecato. La numpyparte di pylabè banale, nel senso che le loro importazioni hanno lo stesso numero di byte, quindi solo la stampa di materiale potrebbe provenire ulteriormente pylab, ma sospetto che non sia quello che avevi in ​​mente con la tua domanda.
Andras Deak,

2
@AndrasDeak, sono consapevole che l'uso di pylab è considerato una cattiva pratica, ma molto poco in codegolf può essere considerato una buona pratica. Pylab include direttamente parti di molti numpypacchetti. Ad esempio pylab.randintè valido dove richiederebbe numpy numpy.random.randint. Quindi per il golf pylabdovrebbe fornire un codice più breve.
user2699

1
Sono consapevole che la deprecazione non è un problema, il mio punto era che non offre alcun vantaggio. Semplicemente non mi rendevo conto che anche i pacchetti secondari fossero caricati nello spazio dei nomi pylab in quel modo! Mi dispiace, hai perfettamente ragione :)
Andras Deak,

Risposte:


5

Usa la trasmissione di Numpy

Trasmettere significa replicare un array multidimensionale lungo alcune delle sue dimensioni singleton in modo che corrispondano alle dimensioni di un altro array. Ciò accade automaticamente per le matrici Numpy quando vengono applicati operatori aritmetici.

Ad esempio, per generare una tabella di moltiplicazione 10 × 10 è possibile utilizzare

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

Provalo online!

Qui tviene creato come l'array Numpy [1, 2, ..., 10]. Questo ha forma (10,), che equivale a (1,10). L'altro array di operandi t[:,None]ha dimensioni (10,1). Moltiplicando le due matrici le replica implicitamente, quindi si comportano come se avessero entrambe forma (10,10). Il risultato, anch'esso con forma (10,10), contiene i prodotti per tutte le coppie di voci negli array originali.


È stato un uso intelligente delle ziptrasmissioni, verrà fuori nella sua risposta?
user2699

@ user2699 Non credo che valga una risposta separata, perché [*zip(t)]ha lo stesso numero di byte del più leggibile t[:,None]. Ma hai ragione, vale la pena notare, quindi l'ho aggiunto qui
Luis Mendo,

Buon punto, immagino di non aver effettivamente contato i byte. [*zip(t)]sarebbe più corto di due byte se ci fossero più dimensioni.
user2699

1
Nota che il disimballaggio iterabile esteso [*zip(t)]funzionerà solo su Python 3.
Andras Deak,

Ho visto questa pagina perché sono interessato a scoprire cosa ha il numpy che Perl 6 non ha. In ogni caso, sarebbe scritto come my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]o potresti usarezip(t)
Brad Gilbert b2gills

2

Usa r _ [...] invece di range (...)

Numpy fornisce una sintassi simile a matlab per la creazione di array mediante r_[...]. Qualsiasi notazione di sezione tra parentesi viene interpretata come una matrice con l'intervallo indicato. Quindi, per esempio

r_[:30:4]

è equivalente a

arange(0,30,4)

e per la maggior parte degli usi può sostituire

range(0,30 4)

Può anche gestire espressioni più complesse. Ad esempio per ottenere indici da 0 a 10 e tornare indietro di nuovo,

r_[:10,10:-1:-1]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.