2014-09-18 56 views
7

我正在做我的第一次真正進軍Python和NumPy做一些圖像處理。我有一個圖像加載爲3維NumPy陣列,其中軸0代表圖像帶,而軸1和2代表像素的行和列。由此,我需要採用代表每個像素的3x1矩陣並執行一些操作,這些操作會導致另一個3x1矩陣,這將用於構建結果圖像。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]) 

但是,這在我看來是不雅的,效率低下。有沒有辦法在元素之FASION要做到這一點,例如:

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

在試圖找到一個解決這個問題我碰到this問題,這顯然是非常相似來了。然而,作者無法解決問題,他們的滿意度。我希望自2012年以來發生了一些變化,或者我的問題與他們的問題有很大的不同,使其更容易解決。

回答

10

Numpy數組默認情況下使用按照元素的乘法。看看numpy.einsum和numpy.tensordot。我認爲你正在尋找的是這樣的:

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

這對這些數據完美的作品,應該適應類似的問題,謝謝! – Joe 2014-09-19 13:28:33

+1

在我的情況下輸入形狀是:(100,100,3)。花了我一段時間來理解它,但可能對其他人有用。在我的情況下,它是: results = np.einsum('ij,klj-> kli',factor,input) – Luigolas 2015-05-11 10:47:14