Hogyan építeni egy tömböt alkalmas numpy válogatás?

szavazat
1

Meg kell rendezni a két csoportot egyszerre, vagy inkább azt kell rendezni egyik tömbök, és hogy a megfelelő elem a hozzá tartozó tömb, mint én rendezni. Azaz, ha a tömb [(5, 33), (4, 44), (3, 55)], és azt a fajta az első tengely (jelzett alábbi dtype = 'alfa') akkor szeretnék: [(3,0, 55,0 ) (4,0, 44,0) (5,0, 33,0)]. Ezek igazán nagy adathalmazok és azt kell rendezni az első (n kapcsolódás (n) sebesség), mielőtt végzek egyéb műveletek. Nem tudom, hogyan lehet egyesíteni a két különálló tömböt bár a megfelelő módon, hogy a rendezési algoritmusnak működik. Azt hiszem, a probléma meglehetősen egyszerű. Próbáltam három különböző módszerrel:

import numpy
x=numpy.asarray([5,4,3])
y=numpy.asarray([33,44,55])

dtype=[('alpha',float), ('beta',float)]

values=numpy.array([(x),(y)])
values=numpy.rollaxis(values,1)
#values = numpy.array(values, dtype=dtype)
#a=numpy.array(values,dtype=dtype)
#q=numpy.sort(a,order='alpha')
print Try 1:\n, values

values=numpy.empty((len(x),2))
for n in range (len(x)):
        values[n][0]=y[n]
        values[n][1]=x[n]
print Try 2:\n, values
#values = numpy.array(values, dtype=dtype)
#a=numpy.array(values,dtype=dtype)
#q=numpy.sort(a,order='alpha')

###
values = [(x[0], y[0]), (x[1],y[1]) , (x[2],y[2])]
print Try 3:\n, values
values = numpy.array(values, dtype=dtype)
a=numpy.array(values,dtype=dtype)
q=numpy.sort(a,order='alpha')

print Result:\n,q

Azt megjegyzésbe az első és a második trys mert létre hibákat, tudtam, hogy a harmadik működne, mert ez volt a tükrözés, amit láttam, amikor én voltam RTFM. Tekintettel a tömbök x és y (amelyek igen nagy, csak néhány példa látható) hogyan megépíteni a array (úgynevezett értékek), hogy lehet nevezni a numpy.sort rendesen?

*** Zip remekül működik, köszönöm. Bónusz kérdés: Hogyan lehet később bontsa ki a rendezni az adatokat két tömböt újra?

A kérdést 18/02/2009 07:45
a forrás felhasználó
Más nyelveken...                            


6 válasz

szavazat
2

Azt hiszem, akkor csak meg kell adnia a tengelyt, hogy Ön válogatás, amikor megtette a végső ndarray. Alternatívaként argsort egyik az eredeti tömbök és akkor van egy indexelt tömb, melynek segítségével, hogy néz ki a két x és y, ami azt jelenti, hogy nem kell értéket egyáltalán.

(Scipy.org tűnik elérhetetlen most vagy én elhelyezhet egy linket egyes dokumentumok)

Tekintettel arra, hogy a leírás nem egészen egyezik kódrészletbe nehéz megmondani teljes bizonyossággal, de azt gondolja, hogy túl bonyolult létrehozása a numpy tömb.

Válaszolt 18/02/2009 09:18
a forrás felhasználó

szavazat
6

Azt hiszem, amit akar, a zip funkciót. Ha van

x = [1,2,3]
y = [4,5,6]

azután zip(x,y) == [(1,4),(2,5),(3,6)]

Tehát a tömb lehet kialakítani segítségével

a = numpy.array(zip(x,y), dtype=dtype)
Válaszolt 18/02/2009 09:19
a forrás felhasználó

szavazat
1

Nem tudtam, hogy egy működő megoldás segítségével numpy azon sortfunkcióját, de itt még valami, ami működik:

import numpy
x = [5,4,3]
y = [33,44,55]
r = numpy.asarray([(x[i],y[i]) for i in numpy.lexsort([x])])

lexsortvisszaadja a permutáció a tömbindexek amely helyére teszi a sorok rendezett sorrendben. Ha akarta az eredményeket rendezve több kulcs, pl xmajd a yhasználni numpy.lexsort([x,y])helyette.

Válaszolt 18/02/2009 09:27
a forrás felhasználó

szavazat
3

a bónusz kérdés - zip valójában unzips is:

In [1]: a = range(10)
In [2]: b = range(10, 20)
In [3]: c = zip(a, b)
In [4]: c
Out[4]: 
[(0, 10),
 (1, 11),
 (2, 12),
 (3, 13),
 (4, 14),
 (5, 15),
 (6, 16),
 (7, 17),
 (8, 18),
 (9, 19)]
In [5]: d, e = zip(*c)
In [6]: d, e
Out[6]: ((0, 1, 2, 3, 4, 5, 6, 7, 8, 9), (10, 11, 12, 13, 14, 15, 16, 17, 18, 19))
Válaszolt 18/02/2009 19:11
a forrás felhasználó

szavazat
3

Simon azt argsort mint alternatív megközelítést; Azt ajánlom, mint az út. Nem rendetlen összefonódó, cipzár, vagy kicsomagoló: csak hozzáférést index.

idx = numpy.argsort(x)
ans = [ (x[idx[i]],y[idx[i]]) for i in idx]
Válaszolt 05/07/2009 17:09
a forrás felhasználó

szavazat
3

zip() Lehet , hogy nem hatékony nagy tömböket. numpy.dstack()lehetne használni helyett zip:

ndx = numpy.argsort(x)
values = numpy.dstack((x[ndx], y[ndx]))
Válaszolt 10/04/2010 06:44
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more