PDA

View Full Version : [python]Problemi con istogrammi


MasterDany
20-12-2008, 12:02
Sto leggendo il libro Pensare Da Informatico e non ho capito bene cosa bisogna fare nell'esercizio del capitolo 9 paragrafo 9.8.Ecco il link:http://www.python.it/doc/Howtothink/Howtothink-html-it/chap09.htm

L'esercizio è questo:
Esercizio: scrivi una funzione chiamata Istogramma che prende una lista ed il numero di intervalli da considerare e ritorna l'istogramma della distribuzione dei valori per ciascun intervallo

Ringrazio anticipatamente chi mi aiuterà. ;)

VICIUS
20-12-2008, 12:51
Devi mostrare a video un istogramma dei dati. Hai già tutto quello che ti serve per generare i dati casuali, dividerli in intervalli e contarli. Devi solo disegnare a video il grafico.

MasterDany
20-12-2008, 13:05
Devi mostrare a video un istogramma dei dati. Hai già tutto quello che ti serve per generare i dati casuali, dividerli in intervalli e contarli. Devi solo disegnare a video il grafico.
Penso di aver capito appeno finito a giocare a Follout ci provo


Però non riesco a quale parte di codice sostituisce questo:

NumIntervalli = 8
Conteggio = [0] * NumIntervalli
for i in Lista:
Indice = int(i * NumIntervalli)
Conteggio[Indice] = Conteggio[Indice] + 1

MasterDany
20-12-2008, 14:15
Il risultato è questo ma è impossibile:


import random

def Crea_Lista(lung):
lista=[0]*lung
for i in range(8):
lista[i]=random.random

return lista

def NellIntervallo(Lista,LimiteSuperiore,LimiteInferiore):
Conteggio=0
for N in Lista:
if LimiteInferiore<N<LimiteSuperiore:
Conteggio=Conteggio+1
return Conteggio

def Istogramma(Lista,inte):
amp=1.0/inte
for i in range(inte):
LimiteInferiore=i*amp
LimiteSuperiore=LimiteInferiore+amp
print LimiteInferiore,NellIntervallo(Lista,LimiteSuperiore,LimiteInferiore),LimiteSuperiore

Istogramma(Crea_Lista(8),8)

MasterDany
20-12-2008, 14:27
ecco ho risolto:

import random

def Crea_Lista(lung):
lista=[0]*lung
for i in range(8):
lista[i]=random.random()

return lista


def NellIntervallo(Lista,LimiteSuperiore,LimiteInferiore):
Conteggio=0
for N in Lista:
if LimiteInferiore<N<LimiteSuperiore:
Conteggio=Conteggio+1
return Conteggio

def Istogramma(inte):
amp=1.0/inte
for i in range(inte):
LimiteInferiore=i*amp
LimiteSuperiore=LimiteInferiore+amp
print LimiteInferiore,'\t',NellIntervallo(Crea_Lista(8),LimiteSuperiore,LimiteInferiore),'\t',LimiteSuperiore


Istogramma(8)



Ecco il risultato:
0.0 2 0.125
0.125 2 0.25
0.25 0 0.375
0.375 2 0.5
0.5 1 0.625
0.625 3 0.75
0.75 1 0.875
0.875 0 1.0

VICIUS
20-12-2008, 15:01
L'output non è che assomigli molto ad un istogramma :) Invece dei due valori dovresti stampare il valore centrale dell'intervallo e al posto del numero una colonna con altezza proporzionale al numero di elementi al suo interno.

MasterDany
20-12-2008, 18:42
L'output non è che assomigli molto ad un istogramma :) Invece dei due valori dovresti stampare il valore centrale dell'intervallo e al posto del numero una colonna con altezza proporzionale al numero di elementi al suo interno.

mmm...non capisco proprio cosa devo stampare.Il valore centrale dell'intervallo cos'è Conteggio???

VICIUS
20-12-2008, 18:48
È semplicemente la media dei due estremi dell'intervallo.

VICIUS
20-12-2008, 18:49
Poi ho notato solo ora che crei ogni volta una nuova lista di numeri casuali che è semplicemente assurdo.

MasterDany
20-12-2008, 18:56
La salvo in una variabile.In realtà l'avevo già fatto ma non avevo postato.Però il punto ora è come creare sto isogramma non è che puoi farmi un disegnino??

VICIUS
20-12-2008, 19:02
Da wikipedia:
http://upload.wikimedia.org/wikipedia/it/b/bd/Esempio_di_istogramma.jpg

Come suggerimento. Fai le barre orizzontali, e ripassa l'operatore * per le stringhe.

MasterDany
20-12-2008, 19:09
Siamo come prima.Una cosa tipo questa:

7
6
5
4
3
2
1
intervallo1 intervallo 2 intervallo 3

MasterDany
22-12-2008, 09:55
FullSystem gentilmente mi ha fornito un codice:

import random


def lista_casuale(l):
lista = [0] * l # crea una lista di "l" elementi piena di zeri
for i in range(l): # qui ciclo per "l" volte coì posso scrivere su tutti gli elementi della lista appena creata
lista[i] = random.random() # genero un numero casuale e lo metto nella lista
return lista # ritorno la lista a chi mi a chiamato

def dividi_in_barre(lista, n):
barre = [0] * n # crea una lista di "n" elementi che rappresentano le barre dell'istogramma
for x in lista: # ciclo per tutti numeri casuali presenti nella lista
barre[int(x * n)] += 1 # calcolo che indice ha la barra che contiene il numero casuale x e poi incremento di uno il valore della barra
return barre # ritorna la lista delle barre

def istogramma(lista, n):
barre = dividi_in_barre(lista, n) # divide la lista di numeri random in "n" barre dell'istogramma
for barra in barre: # ciclo per ogni barra presente nell'istogramma
print barra, "x" * barra # stampa il numero di elementi e poi una "x" ripetuta tante volte quanti sono i numeri di elementi presenti in quella barra


lista = lista_casuale(100)
istogramma(lista, 10)


Allora mi sono messo con carta e penna e forse ho capito come funziona:

La cosa che mi rimaneva più difficile era la funzione dividi_in barre che secondo me fa questo:
Moltiplicano il numero degli intervalli per gli elementi della lista otteniamo un numero compreso fra 0.0 e il numero degli intervalli.
Con int() lo arrotondiamo per difetto e questo numero corrisponde all'indice dove cade il valore.

Infine la funzione istogramma stampa l'inervallo nel quale cade un determinato valore e quante volte è presente un determinato valore.

Però mi è rimasto un dubbio perchè +1??

barre[int(x * n)] += 1

MasterDany
22-12-2008, 09:58
Ho capito

barre[int(x * n)] += 1

serve a incrementare il contatore.

cdimauro
24-12-2008, 13:13
Purtroppo continuo ad avere poco tempo, ma vedo che la mia assenza, al contrario, porta buoni frutti.

E' sempre meglio sbattere la testa da soli nei problemi che si incontrano, anziché ricorrere all'aiuto di terzi.

Quindi il mio consiglio è di provare a perderci un po' di tempo, e soltanto dopo un po', se proprio non si riesce a cavare un ragno dal buco, chiedere qualche suggerimento (ma NON la soluzione).

MasterDany
24-12-2008, 16:48
Purtroppo continuo ad avere poco tempo, ma vedo che la mia assenza, al contrario, porta buoni frutti.

E' sempre meglio sbattere la testa da soli nei problemi che si incontrano, anziché ricorrere all'aiuto di terzi.

Quindi il mio consiglio è di provare a perderci un po' di tempo, e soltanto dopo un po', se proprio non si riesce a cavare un ragno dal buco, chiedere qualche suggerimento (ma NON la soluzione).
Infatti si ti avevo inviato un pvt ma poi ragionando sono arrivato a quella conclusione ;)