tumblr series of tubes:

>>

« and the shapes | Main | had a handle on it »

Agosto 14, 2012

dar vienas uždavinys

kadangi vakar buvo šviežias pirmadienis, buvo fancy duomenų struktūrų diena. viskas kaip ir veikia, bet trisdešimt kartų lėčiau ,)

uždavinio esmė, labai grubiai -- dirbu su astronominėmis nuotraukomis, sumuoju pikselius, esančius ant nurodytos formos incrementinamo dydžio elipsių. kadangi elipsė -- tai abstrakti matematinė figūra, o dirbti reikia grubioje pikselių erdvėje, yra pora niuansų: teoriškai apskaičiuojamos elipsės koordinatės gali išlįsti iš duoto masyvo ribų, taip pat atsiranda pasikartojančių koordinačių porų.

galaxy1.png


kaip _greitai_ implementuoti tokį veiksmą? kalba eina apie 2.6 pythoną. įdomiau būtų ne pats kodas, o idėja -- kaip išrinkti pasikartojančius elementus?



# pradinio atvaizdo indeksų masyvas
a = (some long array of coordinate tuples, e.g. (1428, 299))
#elipsės koordinačių sąrašas
b = (some shorter array of coordinate tuples)

#collections:
a_multiset = collections.Counter(list(a))
b_multiset = collections.Counter(list(a))
overlap = list((a_multiset & b_multiset).elements())


suprantu, kad tai yra overkill -- užtektų iš elipsės koordinačių išmesti tas poras, kuriose yra netinkama vertė. bet man toks sprendimas patinka automatiniu duplikatų atmetimu. ir tuo, kad trys eilutės.

Posted by kpmg at Agosto 14, 2012 11:02 AM kaip.tik.ten

Comments

set(a).difference(b) # šitie nesikartoja
set(a).intersection(b) # kartojasi

a2=set(a)
a2.difference_update(b) #pasikartojančių pašalinimas

O kaipgi kitaip?

Posted by: vyt at Agosto 15, 2012 8:56 AM

tie high level duomenų tipai labai faini, bet pasidaro per didelis bottleneckas, kai reikia metodą kviesti kelis šimtus kartų ir tūkstančiui galaktikų.
perdariau su numpy ir enumerate(), iš esmės va taip:

for i, v in enumerate(out):
#praiteruoja per elipsės koordinačių masyvą, atmeta išlendančias vertes.
if ((Y[i] >= 0) & (Y[i] = 0) & (X[i] < inputShape[1])):
out[i, 0] = (Y[i], X[i])

#numpy.unique() -- surenka unikalių elementų (tuplų) indeksus

u, indices = np.unique(ellipseCoords, return_index=True)

# ir tais indeksais suindeksuoja koordinačių masyvą.
ellipseCoords = ellipseCoords[indices]

va berašydama dar sugalvojau, kad reikėtų pirmą operaciją vektorizuoti ir pakišt c kodui po numpy apačia, bet ir šiaip vykdymo laikas sutrumpėjo nuo 7 minučių vienai galaktikai iki 25 s ,)

Posted by: opit at Agosto 15, 2012 1:23 PM

Post a comment




Remember Me?