2015-10-20 62 views
2

我被要求在二維數組/矩陣(行,列)中試驗numpy計算值,其中這些值取決於相鄰值。我承認,這不僅僅是將矩陣乘以一個標量或類似的東西,儘管它可能會縮減爲一系列這樣的步驟。基於相鄰值進行有效向量化計算的習慣性方法?

即使這是作業,我的問題範圍更廣,而不僅僅是要求提供給我的解決方案。

我已經閱讀過關於numpy的廣播(即向量化),我可以想象一種方法是將其作爲新的ufunc並在矩陣上運行它。然而,我有點擔心我可能面臨的侷限性 - 一個numpy ufunc訪問一個相鄰元素,而不是它在當前迭代期間計算的那個?從概念上講:

for x in columns: 
    for y in rows: 
     a[x, y] = a[x, y - 1] + a[x, y + 1] + a[x - 1, y] + a[x + 1, y] + A + B + b[x, y] # '+' is just an example of a binary op here. 

這意味着每個單元中的值依賴於相鄰小區中,也有一些常量和偶數值在另一個矩陣。

閱讀numpy文檔沒有幫助我所有這些。在numpy中這樣做的首選/慣用方式是什麼?

+0

投票結束的人請提供理由,否則我不知道什麼是錯的,並且我的下一個類似風格的問題也有很大的機會也會得票,等等。 – amn

+0

我可以找到關於這個問題的「壞」的唯一的東西是你寫的過於詳盡的散文 - 我的建議是試圖減少你提到的所有「與問題無關的」事實,但是再次,我完全處於青睞提及目標和背景的人。你的文字只是*重複*,但不太* *,恕我直言。 –

回答

2

你描述的是在圖像處理中很常見的 - 在那裏它被稱爲應用內核做二維過濾(只是爲了給你一些谷歌)。從Numpy ndimage documentation:本節中的所有執行某種類型的輸入數組的 空間濾波的描述

的功能:在所述輸出中的元素是 在相應 輸入元件的附近的值的一些功能。我們將這個元素的鄰域稱爲內核過濾器 ,該內核通常是矩形的,但也可能具有任意的佔位面積。下面介紹的許多功能允許您通過傳遞掩碼通過 佔用空間參數來定義內核的佔用空間。例如十字形內核可以被定義如下 :

footprint = array([[0,1,0],[1,1,1],[0,1,0]]) 
footprint array([[0, 1, 0], 
       [1, 1, 1], 
       [0, 1, 0]]) 

你會那麼做的是使用什麼convolve function:像xnx's answer

from scipy import ndimage 
output = ndimage.convolve(matrix, footprint) 

如果你想「包裝」的行爲有,請使用mode="wrap"參數convolve

output = ndimage.convolve(matrix, footprint, mode="wrap") 
+0

謝謝。我不確定我可以使用'scipy',而且我甚至沒有安裝它。我有'numpy'。是否有可能進行卷積並應用沒有SciPy的內核?我已經檢查過並且在'numpy'中有一個'convolve()'。似乎'scipy'和'numpy'之間的關係也不是很明確。 – amn

2

適當地切片你的陣列可以幫助你在簡單的情況下。例如在一個陣列a添加相鄰列和行輸出數組,B

In [5]: B = a.copy() 
In [6]: B[1:,:] += a[:-1,:] 
In [7]: B[:-1,:] += a[1:,:] 
In [8]: B[:,1:] += a[:,:-1] 
In [9]: B[:,:-1] += a[:,1:] 

(這不會給完全相同的結果作爲convolve做法,對方的回答暗示,因爲它處理的邊緣的數組不同。)

+0

編輯我的答案; 'mode =「wrap」'確實如此:) –

相關問題