NumPy

2014-09-18 46 views
7

'daki Eleman-bilge matris çarpımı Python ve NumPy'ye ilk görüntüyü bazı görüntü işleme yapmak için yapıyordum. Eksen 0 görüntü bantlarını temsil ederken 3 boyutlu NumPy Array olarak yüklenmiş bir görüntü var, eksen 1 ve 2 sütun ve piksel satırlarını temsil eder. Bundan sonra, her bir pikseli temsil eden 3x1 matrisini almam ve bir sonuç görüntüsü oluşturmak için kullanılacak olan başka bir 3x1 matrisiyle sonuçlanan birkaç işlem yapmam gerekiyor.NumPy

import numpy as np 
import random 

factor = np.random.rand(3,3) 
input = np.random.rand(3,100,100) 
results = np.zeros((3,100,100)) 

for x in range(100): 
    for y in range(100): 
     results[:,x,y] = np.dot(factor,input[:,x,y]) 

Ama bu beni inelegant ve verimsiz grev:

Benim ilk yaklaşım (basitleştirilmiş ve rastgele verilerle) buna benzer. Açıkçası oldukça benzer this sorusuna, rastladım bu soruna bir çözüm bulmak için çalışırken, öğeye fasion bunu yapmanın bir yolu, ör .:

results = np.dot(factor,input,ElementWiseOnAxis0) 

var mı. Ancak, yazar problemi tatmin edemedi. 2012'den beri bir şeyin değiştiğini umuyorum ya da benim problemim, daha kolay çözülebilir hale getirmek için onlarınkinden yeterince farklı.

cevap

10

Numpy dizileri, varsayılan olarak eleman-bilge çarpımını kullanır. Numpy.einsum ve numpy.tensordot göz atın. Sanırım aradığınız şey şunun gibi:

results = np.einsum('ij,jkl->ikl',factor,input) 
+0

Bu veriler, bu veriler için mükemmel çalışıyor ve benzer sorunlara da uyarlanabilmeli, teşekkürler! – Joe

+1

Benim durumumda giriş şekli: (100, 100, 3). Anlamak için biraz zamanımı aldı, ama başkalarına yararlı olabilir. Benim durumumda: results = np.einsum ('ij, klj-> kli', factor, input) – Luigolas