2012-11-25 17 views
9

Aynı şekilden iki giriş dizim x ve y var. Elemanlarının her birini bir işlev aracılığıyla eşleşen indekslerle çalıştırmalıyım, daha sonra sonuçları üçüncü bir dizideki bu indekslere kaydetmeliyim. Bunu gerçekleştirmenin en pythonik yolu nedir? Şu anda dört tane dört döngüye sahibim - Eminim daha kolay bir yol var.Dizi eleman hareketleri

x = [[2, 2, 2], 
    [2, 2, 2], 
    [2, 2, 2]] 

y = [[3, 3, 3], 
    [3, 3, 3], 
    [3, 3, 1]] 

def elementwise_function(element_1,element_2): 
    return (element_1 + element_2) 

z = [[5, 5, 5], 
    [5, 5, 5], 
    [5, 5, 3]] 

İşlevim yalnızca tek tek veri çiftlerinde çalışacağından dolayı kafam karışıyor. X ve y dizilerini işleve atamam.

+1

numpy dizileri varsayılan akıllı elemanı vardır. Yani, x + y = z – user1767344

+1

İşlemi matris düzeyinde yapabileceğinize dair bir umut var mı? Örneğin, yukarıdaki örnekte 'z = x + y' çalışır. Belki de fonksiyonunuzun ne olduğunu bize gösterebilir ve matrisler üzerinde çalışmanıza yardımcı olabiliriz. –

cevap

12

Bir "daha kolay yol", numpy.vectorize kullanarak NumPy farkındalık işlevi oluşturmaktır. Bir "ufunc", elemansal bir fonksiyon için NumPy terminolojisidir (dokümantasyona bakınız here). numpy.vectorize öğesinin kullanılması, diğer NumPy ufuncs (standart ekleme, vb.) Ile aynı şekilde çalışan kendi ufunc'inizi oluşturmak için kullanmanıza olanak tanır: ufunc dizileri kabul eder ve her çiftinize işlevinizi uygular. elemanlar, standart NumPy işlevleri gibi, dizi biçiminde yayın yapar. documentation page, yardımcı olabilecek bazı kullanım örneklerine sahiptir.

4

(Ben senin numpy.array, basit piton list bahsetmiyorum tahmin ediyorum)

Özyineleme hep hayatımız kolaylaştıran:

def operate_on_Narray(A, B, function): 
    try: 
     return [operate_on_Narray(a, b, function) for a, b in zip(A, B)] 
    except TypeError as e: 
     # Not iterable 
     return function(A, B) 

Kullanımı:

>>> x = [[2, 2, 2], 
...  [2, 2, 2], 
...  [2, 2, 2]] 
>>> 
>>> y = [[3, 3, 3], 
...  [3, 3, 3], 
...  [3, 3, 1]] 
>>> operate_on_Narray(x, y, lambda a, b: a+b) 
[[5, 5, 5], [5, 5, 5], [5, 5, 3]] 

O çalışacak boyutsal başka herhangi bir dizi:

>>> operate_on_Narray([1, 2, 3], [4, 5, 6], lambda a, b: a*b) 
[4, 10, 18] 
1

Bir python'dan gelen aşağıdaki metin dosyası 2.7.3 yorumlayıcı oturumu, 2B matris öğelerine öğesel olarak işlem uygulamak için map yerleşik işlevini gösterir. (Not: operator.addapplier ikinci kullanımda lambda ifade söz belirtilen elementwise_function eşdeğer ve aynı zamanda eşdeğerdir.)

>>> import operator 
>>> def applier(a, b, op): 
...  return map(lambda ro: map(op, ro[0], ro[1]), zip(a,b)) 
... 
>>> applier(x, y, operator.add) 
[[5, 5, 2], [5, 4, 5], [6, 5, 5]] 
>>> x; y 
[[2, 2, 1], [2, 2, 2], [3, 2, 2]] 
[[3, 3, 1], [3, 2, 3], [3, 3, 3]] 
>>> applier(x, y, lambda p,q: p+q) 
[[5, 5, 2], [5, 4, 5], [6, 5, 5]] 
>>> applier(x, y, lambda p,q: p-q) 
[[-1, -1, 0], [-1, 0, -1], [0, -1, -1]] 
>>> applier(x, y, lambda p,q: p*q) 
[[6, 6, 1], [6, 4, 6], [9, 6, 6]]