On Fri, 4 Dec 2020 at 09:14, Bruno Firmani <firmanibr...@gmail.com> wrote:
> Molte grazie. > Chiedo un ulteriore aiuto. > Ciao Bruno, un po' di risposte quotate in ordine a partire dal tuo messaggio iniziale :) > Ho scritto le seguenti righe di codice: > > > xx = numpy.array([ 1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. , 9.]) > yy = numpy.array([ 1./1. , 1./2. , 1./3. , 1./4. , 1./5. , 1./6. , 1./7. , > 1./8. , 1./9.]) > ww = numpy.array([ 1. , 2. , 3. , 5. , 7. , 11. , 13. , 17. , 19.]) > zz = numpy.array([ 1.**2 , 2.**2 , 3.**2 , 4.**2 , 5.**2 , 6.**2 , 7.**2 , > 8.**2 , 9.**2]) > Ok tutto bene fin qui - un paio di heads up di miglioramento 1) NumPy ha la funzione `arange` https://numpy.org/doc/stable/reference/generated/numpy.arange.html che potresti utilizzare per generare il tuo vettore di coordinate x >>> import numpy as np >>> x = np.arange(1, 10) 2) NumPy - a differenza di Python list - supporta il broadcasting degli operatori https://numpy.org/doc/stable/user/basics.broadcasting.html - tra array e scalare o tra array e array Nel tuo caso: >>> yy = np.ones(9) / xx # np.ones genera un array di 1 di lunghezza nove, diviso per xx elemento per elemento >>> zz = xx ** 2 # Numpy fa il broadcasting dell'operatore per ciascun elemento di xx. Tutto avviene a C-level, quindi più efficiente che farlo a Py-Level. [OT] Su 10 numeri non conta nulla. Su 100K, passiamo da micro sec. a nano sec. ;) Per divertirti, usando sempre arange (o Python range) prova a generare numeri in range molto più grandi e usa un timeit ( https://docs.python.org/3/library/timeit.html) per prendere i tempi - e ci dirai ;) [/OT] > yx = numpy.array( list(zip(xx,yy)) ) > wx = numpy.array( list(zip(xx,ww)) ) > zx = numpy.array( list(zip(xx,zz)) ) > Se capisco bene, il tuo obiettivo è generare dei plot a partire dai vettori di coordinate utilizzando matplotlib. Continuo subito sotto. Quoto qui giusto per dirti che questo passaggio è inutile, e puoi tranquillamente evitarlo - uso di zip compreso. Come consiglio generale, sempre meglio evitare passaggi da numpy array -> python list -> numpy array. Inoltre, per inciso, matplotlib è flessibile sia che gli si passi Python lists di numeri che numpy array (in generale, sempre meglio NumPy array per efficienza). > e dovrei far disegnare, per linee, in un unico grafico le liste di punti: > [ [x1,y1] , ... , [xn,yn] ] > [ [x1,w1] , ... , [xn,wn] ] > [ [x1,z1] , ... , [xn,zn] ] > Pensavo di utilizzare matplotlib ma non riesco a trovare le istruzioni > giuste. La funzione di matplotlib che vorresti usare è plot: https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.plot.html Come vedi dalla documentazione, plot è abbastanza flessibile su come passare le coordinate. Il primo esempio - anche quello più comune - è passare x e y (liste o array) come vettori di coordinate Esempio, nel tuo caso >>> from matplotlib import pyplot as plt >>> plt.plot(xx, yy) >>> plt.show() Spero che questo esempio chiarisca perché gli array yx, wx, ... non sono necessari :) > Le liste yx, wx, zx sono adesso liste di punti del piano. > Ora dovrei i loro tre grafici insieme in una unica figura. > Benissimo, arriviamo all'ultimo punto. Matplotlib è basato sul disegno di Canvas - tradotto in altri termini, ogni volta che matplotlib deve disegnare un nuovo punto o un nuovo grafico, ridisegna sulla stessa figura, la nuova figura (di default). In altre parole, finché non si invoca esplicitamente il metodo show() - il canvas di riferimento è sempre lo stesso. Cosa intendo dire? che puoi continuare ad invocare plt.plot tutte le volte che vuoi e con coordinate diverse **prima** di invocare il plt.show() finale che mostra tutto. Traduco in codice (full example) >>> from matplotlib import pyplot as plt >>> plt.figure(figsize=(10, 10)) # non veramente necessario ma solo per mostrarti come creare un oggetto figure. Questa Figure rappresenta l'oggetto in cui le canvas verranno disegnate >>> plt.plot(xx, yy, ) >>> plt.plot(xx, ww) >>> plt.plot(xx, zz) >>> plt.show() Per un plot più sensato vorrai naturalmente cambiare colori e magari anche marker alle linee - ti invito a dare di nuovo una occhiata alla doc di plot linkata prima. Last but not least, se volessi invece avere più plot nella stessa figura ma NON sovrapposti, dovrai sostiture al mio plt.figure, plt.subplots ( https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.subplot.html) Esempio di uso in fondo alla pagina. Spero sia stato sufficientemente chiaro su tutti i punti. Se non fosse così, fa pure sapere :) A presto, Valerio
_______________________________________________ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python