2016-03-24 24 views
0

verimli bir şekilde verimli bir şekilde bir etiket dizisinden python 2.7'deki etiketlere karşılık gelen denklemlere nasıl geçebilir?'Etiketler' dizisinden, Python 2.7 içindeki etiketlere karşılık gelen denklem dizisine taşıyın

Bu görüntü ne demek gösterilmektedir:

denklemler x olacağını dizisi x değerleri çekmek, böylece piton açısından görüntüde "xn" [n]. Örnek olarak, etiket dizisindeki 0 girişi, 1 + x [1 + x [1] olacak denklemlere karşılık gelen "a" dır. Sırada x [1] * 2 olan "b" dir.

Bunu başarmanın pek çok yolu var, ancak verimliliğe odaklanmak istiyorum. Gerçek dizilerin binlerce unsuru vardır ve bu işlem binlerce kez (benim modelimde her zaman) gerçekleştirilir. X dizisi her seferinde farklı olacaktır. Aslında yaptığım şey, çeşitli sınır koşullarına dayanan bir çapraz matrisin köşegenlerini oluşturmak.

Herkes bir anahtar kutusuyla her bir dizide tüm dizi boyunca yinelemekten daha iyi bir fikir verebilir mi?

''' 
Equations corresponding to various labels 

a -> 2+x[n] 
b -> 3*x[n-1]+2x[n] 
c -> 4*x[n] 

These are just dummy equations I am making up for the example 
''' 

x = [4,7,6,6,9,12,4,9,1,11] 

labelArray = ['a','b','b','b','c','c','a','b','b','c'] 

outputArray = [] 
n = 0 
for label in labelArray: 
    if label == 'a': 
     output = 2+x[n] 
    elif label == 'b': 
     output = 3*x[n-1]+2*x[n] 
    elif label == 'c': 
     output = 4*x[n] 
    outputArray.append(output) 
    n += 1 

print outputArray 
# outputArray = [6, 26, 33, 30, 36, 48, 6, 30, 29, 44] 
+0

, kullanım düşünmek 'dict' – woozyking

cevap

1

Burada ile geldi bir çözüm: İşte

it a kaba bir şekilde yapıyor bana bir örnektir. Optimal çözüm olmasa da daha hızlı ve daha öz olmalıdır.

from itertools import imap 

# List of values 
values = [4, 7, 6, 6, 9, 12, 4, 9, 1, 11] 

# A list of corresponding methods for each value, must be same length as values. 
# Optionally, you could create the data with the value and method in a tuple 
# e.g. [(4, 'a'), (7, 'b') ... (x, 'y')] 
# Though if you ensure both lists are of the same length, you can use the zip() 
# method, which does the same thing. 
methods = ['a', 'b', 'b', 'b', 'c', 'c', 'a', 'b', 'b', 'c'] 

# A dictionary with all your equations. You can also define them in a function 
# elsewhere and include them like 
# >{ 'a': external_function } 
equations = { 
    # Lambda is just an anonymous function. 
    'a': lambda index: 2 + values[index], 
    'b': lambda index: 3 * values[index-1] + 2 * values[index], 
    'c': lambda index: 4 * values[index], 
} 


# Returns an iterator to prevent eating up your memory with one big array. 
new_values = imap(lambda x,y: equations[x](y), methods, xrange(len(values))) 
print [value for value in new_values] 

inşa yöntemlerde burada kullanıyorum bir açıklama için dışarı https://docs.python.org/2/library/functions.html kontrol edin. Yineleyiciler hakkında bazı bilgiler: http://anandology.com/python-practice-book/iterators.html

+0

Verdiğiniz her iki bağlantıları kontrol ettim, ama ben "imap" hiçbir yerde göremiyorum. "İsim 'imap' tanımlanmadı" ifadesini kullandığınızda kodum dışarı çıkar. Bir kütüphane mi almalıyım? Teşekkürler –

+0

Kötü, ithalat ifadesini eklemeyi unuttum. Sabit! – BenHohner

+0

@TomStockman, herhangi bir şans? – BenHohner

0

Burada, kodunuzun bir sözlük ve bir harita işlevi kullanan bir sürümünüz vardır. Umarım size yardımcı olur. Zaman verimliliği bahsediyorsan

functs = { 'a': '2+x[n]', 
      'b': '3*x[n-1] + 2*x[n]', 
      'c': '4*x[n]'} 

x = [4, 7, 6, 6, 9, 12, 4, 9, 1, 11] 

larray = ['a','b', 'b', 'b', 'c', 'c', 'a', 'b', 'b', 'c'] 

result = list(map(lambda n: eval(functs[larray[n]]), xrange(len(larray)))) 

print result 

# result = [6, 26, 33, 30, 36, 48, 6, 30, 29, 44] 
+0

Bu ilginç bir çözümdür, ancak orijinal kodumdan en az 20x daha yavaş, en azından bilgisayarımda. Yine de yardım ettiğin için teşekkürler. –

+0

@ Tom Stockman: BenHohner'ın çözümüne 'import itertools 'ekleyebilir ve' imut (...) 'yerine' itertools.imap (...) 'kullanabilirsiniz. Senin çözümün kadar hızlı. – guerreiro