Re: [Python] Grafici

2020-12-04 Per discussione Bruno Firmani
Molte grazie.
Chiedo un ulteriore aiuto.


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])

yx = numpy.array( list(zip(xx,yy)) )
wx = numpy.array( list(zip(xx,ww)) )
zx = numpy.array( list(zip(xx,zz)) )

Le liste yx, wx, zx  sono adesso liste di punti del piano.
Ora dovrei i loro tre grafici insieme in una unica figura.
Ho cercato su matplotlib ma non ho trovato indicazioni per me comprensibili.

Posso avere indicazioni?
Grazie



   Bruno Firmani
   Via Giannantonio Manci 5 - 39100 BOLZANO
e.mail firmanibr...@gmail.com
   mlbf1...@gmail.com
tel.   +39 338 5721755 (cellulare)
fax+39 02 70039544


Il giorno ven 4 dic 2020 alle ore 01:02 Alessandro Dentella <
sandro.dente...@gmail.com> ha scritto:

> On Thu, Dec 03, 2020 at 07:24:27PM +0100, Bruno Firmani wrote:
> > Sto muovendo i primi passi in Python.
>
> Benvenuto
>
> >
> > Il mio problema è il seguente:
> >
> > ho quattro liste numeriche:
> >
> > xx = [x1,x2, ... ,xn]
> > yy = [y1,y2, ... ,yn]
> > ww = [w1,w2, ... ,wn]
> > zz = [z1,z2, ... ,zn]
> >
> > 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] ]
> >
> > Chiedo, se possibile, di avere indicazioni.
>
> una cosa tipo zip(xx, yy)?
>
> In [1]: xx = ['x1','x2', 'xn']
>...: yy = ['y1','y2', 'yn']
>...: ww = ['w1','w2', 'wn']
>...: zz = ['z1','z2', 'zn']
>
> In [2]: list(zip(xx, yy))
> Out[2]: [('x1', 'y1'), ('x2', 'y2'), ('xn', 'yn')]
>
> In [3]: list(zip(xx, ww))
> Out[3]: [('x1', 'w1'), ('x2', 'w2'), ('xn', 'wn')]
>
> *:-)
>
>
> --
> Sandro Dentella  *:-)
> http://wikidattica.org Flashcard per la didattica
> ___
> Python mailing list
> Python@lists.python.it
> https://lists.python.it/mailman/listinfo/python
>
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] list comprehension

2020-12-04 Per discussione Carlos Catucci
On Fri, 4 Dec 2020 at 10:45, Walter Valenti  wrote:

> Ciao,
> usa semplice domanda sulle list comprehension
> Faccio l'esempio con questo semplice codice:
>
> lista = [0,1,2,3,4,5,6,7,8,9,10,12,14,16]
> s = [n for n in lista if n%2 == 0][2]
> print(s)
>
>
> In questo caso l'interprete (nel mio caso 3.8.6) è "intelligente" da
> fermarsi all'elemento con indice due
> nella comprehension o verifica comunque la condizione su tutta la lista ?
>

No cosi' assegna a s il terzo (le liste partono con indice 0) elemento
della lista generata dalla list comprehension.
Carlos
-- 
EZLN ... Para Todos Todo ... Nada para nosotros
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] list comprehension

2020-12-04 Per discussione Marco Beri
On Fri, 4 Dec 2020 at 10:45, Walter Valenti  wrote:

> Ciao,
> usa semplice domanda sulle list comprehension
> Faccio l'esempio con questo semplice codice:
>
> lista = [0,1,2,3,4,5,6,7,8,9,10,12,14,16]
> s = [n for n in lista if n%2 == 0][2]
> print(s)
>
> In questo caso l'interprete (nel mio caso 3.8.6) è "intelligente" da
> fermarsi all'elemento con indice due
> nella comprehension o verifica comunque la condizione su tutta la lista ?
>

Testa la condizione su tutta la lista.

Puoi verificarlo così:

>>> lista = [0,1,2,3,4,5,6,7,8,9,10,12,14,16]
>>> def pari(n):
... print(n)
... return n % 2 == 0
...
>>> s = [n for n in lista if pari(n)][2]
0
1
2
3
4
5
6
7
8
9
10
12
14
16
>>> print(s)
4


Ciao.
Marco.
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] Grafici

2020-12-04 Per discussione Valerio Maggio
On Fri, 4 Dec 2020 at 09:14, Bruno Firmani  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


Re: [Python] Dizionari: ottenere la chiave, dal valore.

2020-12-04 Per discussione Ernesto Arbitrio
Domanda ... ma i valori sono unici ?? nel senso non hai situazioni tipo
{"a":1, "b":1}??

On Fri, Dec 4, 2020 at 11:08 AM Gabriele Battaglia  wrote:

> Ciao.
> Se cerco la chiave conoscendo il valore, esiste una funzione da
> applicare sul dizionario che me la fornisca direttamente, invece di
> dover iterare con un for su tutti i valori?
>
> Grazie.
> G
> --
> Gabriele Battaglia, IZ4APU (Libero)
> Sent from TB on Windows 10, Genus Bononiae's computer.
> ___
> Python mailing list
> Python@lists.python.it
> https://lists.python.it/mailman/listinfo/python
>
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] Dizionari: ottenere la chiave, dal valore.

2020-12-04 Per discussione Valerio Maggio
On Fri, 4 Dec 2020 at 10:08, Gabriele Battaglia  wrote:

> Ciao.
>

Ciao Gabriele


> Se cerco la chiave conoscendo il valore, esiste una funzione da
> applicare sul dizionario che me la fornisca direttamente, invece di
> dover iterare con un for su tutti i valori?
>

Non esiste questa funzione che io sappia, ma se ci pensi è un po'
controintuitivo, perché staresti utilizzando il dizionario al "contrario".
Proprio per questo, tutte le volte che mi è capitato un caso simile, sono
ricorso alla versione flippata del dizionario - in cui le chiavi diventano
valori, e viceversa.

>>> flipped_dict = {v:k for k, v in original_dict.items() }

Se invece dovesse capitare che più valori nel tuo dizionario corrispondano
alla stessa chiave, userei un setdefault di sicurezza

>>> flipped_dict = dict()
>>> for k, v in original_dict.items():
... rd.setdefault(v, [])
... rd[v].append(k)

*La versione compatta singola riga usando dict-comprehension è lasciata
come esercizio al lettore :D*
Scherzo! :D

Valerio
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] Dizionari: ottenere la chiave, dal valore.

2020-12-04 Per discussione Ernesto Arbitrio
nel caso di valori univoci puoi invertire il dizionario:

mydict2 = dict(map(reversed, mydict.items()))
e quindi
mydict2[val]

altrimenti non hai alternative secondo me ... devi iterare (o usare
librerie esterne tipo Pandas)

quindi scriverti qualcosa che usi una list comprehension

[k for k, v in d.iteritems() if v == value]


On Fri, Dec 4, 2020 at 11:23 AM Valerio Maggio 
wrote:

> On Fri, 4 Dec 2020 at 10:08, Gabriele Battaglia  wrote:
>
>> Ciao.
>>
>
> Ciao Gabriele
>
>
>> Se cerco la chiave conoscendo il valore, esiste una funzione da
>> applicare sul dizionario che me la fornisca direttamente, invece di
>> dover iterare con un for su tutti i valori?
>>
>
> Non esiste questa funzione che io sappia, ma se ci pensi è un po'
> controintuitivo, perché staresti utilizzando il dizionario al "contrario".
> Proprio per questo, tutte le volte che mi è capitato un caso simile, sono
> ricorso alla versione flippata del dizionario - in cui le chiavi diventano
> valori, e viceversa.
>
> >>> flipped_dict = {v:k for k, v in original_dict.items() }
>
> Se invece dovesse capitare che più valori nel tuo dizionario corrispondano
> alla stessa chiave, userei un setdefault di sicurezza
>
> >>> flipped_dict = dict()
> >>> for k, v in original_dict.items():
> ... rd.setdefault(v, [])
> ... rd[v].append(k)
>
> *La versione compatta singola riga usando dict-comprehension è lasciata
> come esercizio al lettore :D*
> Scherzo! :D
>
> Valerio
> ___
> Python mailing list
> Python@lists.python.it
> https://lists.python.it/mailman/listinfo/python
>
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


Re: [Python] Dizionari: ottenere la chiave, dal valore.

2020-12-04 Per discussione Ernesto Arbitrio
scusa items() e non iteritems() che é python2 ... sorry ma sono in una fare
di migrazione progetto da py2 a py3 e sto impazzendo :/

On Fri, Dec 4, 2020 at 11:25 AM Ernesto Arbitrio 
wrote:

> nel caso di valori univoci puoi invertire il dizionario:
>
> mydict2 = dict(map(reversed, mydict.items()))
> e quindi
> mydict2[val]
>
> altrimenti non hai alternative secondo me ... devi iterare (o usare
> librerie esterne tipo Pandas)
>
> quindi scriverti qualcosa che usi una list comprehension
>
> [k for k, v in d.iteritems() if v == value]
>
>
> On Fri, Dec 4, 2020 at 11:23 AM Valerio Maggio 
> wrote:
>
>> On Fri, 4 Dec 2020 at 10:08, Gabriele Battaglia  wrote:
>>
>>> Ciao.
>>>
>>
>> Ciao Gabriele
>>
>>
>>> Se cerco la chiave conoscendo il valore, esiste una funzione da
>>> applicare sul dizionario che me la fornisca direttamente, invece di
>>> dover iterare con un for su tutti i valori?
>>>
>>
>> Non esiste questa funzione che io sappia, ma se ci pensi è un po'
>> controintuitivo, perché staresti utilizzando il dizionario al "contrario".
>> Proprio per questo, tutte le volte che mi è capitato un caso simile, sono
>> ricorso alla versione flippata del dizionario - in cui le chiavi diventano
>> valori, e viceversa.
>>
>> >>> flipped_dict = {v:k for k, v in original_dict.items() }
>>
>> Se invece dovesse capitare che più valori nel tuo dizionario
>> corrispondano alla stessa chiave, userei un setdefault di sicurezza
>>
>> >>> flipped_dict = dict()
>> >>> for k, v in original_dict.items():
>> ... rd.setdefault(v, [])
>> ... rd[v].append(k)
>>
>> *La versione compatta singola riga usando dict-comprehension è lasciata
>> come esercizio al lettore :D*
>> Scherzo! :D
>>
>> Valerio
>> ___
>> Python mailing list
>> Python@lists.python.it
>> https://lists.python.it/mailman/listinfo/python
>>
>
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


[Python] list comprehension

2020-12-04 Per discussione Walter Valenti
Ciao,
usa semplice domanda sulle list comprehension
Faccio l'esempio con questo semplice codice:

lista = [0,1,2,3,4,5,6,7,8,9,10,12,14,16]
s = [n for n in lista if n%2 == 0][2]
print(s)


In questo caso l'interprete (nel mio caso 3.8.6) è "intelligente" da fermarsi 
all'elemento con indice due
nella comprehension o verifica comunque la condizione su tutta la lista ?

Grazie



-- 
Per favore non inviatemi allegati in formato MS Office. Utilizza 
alternativamente documenti in formato OpenDocument.

GPG Fingerprint: 0x56029AD2F77B4C5ED3DB2394BB87A38F146F0DD1
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python


[Python] Dizionari: ottenere la chiave, dal valore.

2020-12-04 Per discussione Gabriele Battaglia

Ciao.
Se cerco la chiave conoscendo il valore, esiste una funzione da 
applicare sul dizionario che me la fornisca direttamente, invece di 
dover iterare con un for su tutti i valori?


Grazie.
G
--
Gabriele Battaglia, IZ4APU (Libero)
Sent from TB on Windows 10, Genus Bononiae's computer.
___
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python