On Tue, 26 Jan 2010 03:15:46 +0100, Massimo Di Stefano <massimodisa...@yahoo.it> wrote:
> ho un problema da risolvere, > provo a spiegarvi di che si tratta sperando di riuscire a darvi un idea > del problema. Non credo di aver capito tutto... > genero un array 2xN dove > > - nella prima colonna ho valori interi ordinati in senso crescente > - nella seconda colonna ho valori disordinati di tipo float (variabili tra > 0 -1) > > un array di esmpio potrebbe essere : > > from numpy import zeros, array > import random > a = zeros((100,2),float) > for i in range(100): > a[i,0] = random.randrange(1000,2000,10) > a[i,1] = random.random() Nota che questo si può ottenre senza loop in python con: a = numpy.concatenate(( numpy.random.random_integers(100, 200, (100,1)) * 10, numpy.random.random_sample((100,1))), axis=1) (con numpy si hanno buone prestazioni se si evitano i loop espliciti e ci si abitua a ragionare per matrici intere, come con matlab). Detto questo, a me la colonna 0 non sembra ordinata, come dichiari, ma casuale. > la prima colonna rappresenta delle altezze "Z" > la seconda colonna rappresenta delle percentuali 0 = 0% , 1 = 100% > (sarebbe una matrice che mi indica la % di pixel ad una determinata Z in > una mappa ) Ovvero la matrice: Z1 P1 Z2 P2 Z3 P3 ti dice: nella mappa ci sono il P1% di pixel alti Z1, il P2% alti Z2 ecc. Quindi si dovrebbe aggiungere il vincolo che la somma di tutti i P(i) fa 1. Sbaglio? > ora io devo stabilire per determinate percentuali (25%, 50%, 75%) > l'altezza corrispondente > ovvero : > > siccome nel mio arrray non troverò mai espresso in maniera precisa il > valore di percentuale che mi serve : 0.25, 0.5, 0.75 > devo inventarmi un metodo ... > > z = z1 + ((z2 - z1) / (f2 - f1)) * (f - f1) Ok, mi sembra una interpolazione lineare. > dove : > > f è la percentuale precisa (valore noto) > > f1 f2 sono i valori (prossimi) al valore di percentuale che mi serve > z1 z2 sono i rispettivi valori di z corrispondenti alle percentuali f1 f2 Ma per fare questo in maniera consistente mi sembra che siano le f a dover essere ordinate, non le z: mi sembra di aver capito che tu, dato f, debba trovare la riga i t.c. f(i) <= f= <f(i+1) ed effettuare un'interpolazione lineare con questi dati. > un esempio : > > array a = > > z f > 1234 0.03 > 2345 0.58 > 3456 0.24 > 3456 0.63 > 3456 0.41 > 3446 0.78 > 2345 0.7 > 8456 0.56 > 3445 0.54 > > se cerco come percentuale il valore f = 0.5 > la Z sarà uguale a : > > z = 3445 + ((8456 - 3445) / (0.56 - 0.54)) * (0.5 - 0.54) Anche in questo caso, le z non sono ordinate come dicevi all'inizio. E neanche le f lo sono, quindi non capisco come mai hai deciso di prendere 0.56 e 0.54 come tuoi valori da interpolare: avresti potuto prendere anche 0.03 e 0.58, visto che 0.5 è lì nel mezzo. > suggerimenti su come procedere ? Se mi chiarisci i punti oscuri ci si prova... -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python