[Python] estrarre valori da un array
Daniele Varrazzo
piro a develer.com
Mar 26 Gen 2010 17:46:16 CET
On Tue, 26 Jan 2010 03:15:46 +0100, Massimo Di Stefano
<massimodisasha a 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
Maggiori informazioni sulla lista
Python