[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