2016-03-02 43 views
1

我創建看起來像這樣的隨機數據源:擴大「像素」上matplotlib + numpy的陣列

Regular random source data

這是我使用gennerate並繪製所述第一圖像的代碼。

import pandas as pd 
import numpy as np 
import numpy.ma as ma 
import matplotlib.pyplot as plt 

msize=25 
rrange=5 
jump=3 
start=1 
dpi=96 
h=500 
w=500 

X,Y=np.meshgrid(range(0,msize),range(0,msize)) 
dat=np.random.rand(msize,msize)*rrange 

msk=np.zeros_like(dat) 
msk[start::jump,start::jump].fill(1) 
mdat=msk*dat 
mdat[mdat==0]=np.nan 
mmdat = ma.masked_where(np.isnan(mdat),mdat) 

fig = plt.figure(figsize=(w/dpi,h/dpi),dpi=dpi) 

cmap = plt.get_cmap('RdYlBu') 
cmap.set_bad(color='#cccccc', alpha=1.) 

plot = plt.pcolormesh(X,Y,mmdat,cmap=cmap) 

plot.axes.set_ylim(0,msize-1) 
plot.axes.set_xlim(0,msize-1) 


fig.savefig("masked.png",dpi=dpi) 

通常情況下,此數據源分佈不均勻(但這是另一個主題)。

是否有任何種類的內插使得點從其位置「溢出」?

就像我們採用淡黃色點@(1,1),並用相同的顏色/值轉動它周圍的所有區域(出租車司機公制中的1個半徑+對角線)(對於圖像上的每個有效點,nans將不擴大)?

正如我在圖像上「不論是否供」,上三個最下/左值,這個想法是找到一種方法,做所有正確的觀點是相同的,而不是使用GIMP對於;-):

Fake mask

經過一番思考我來到這個解決方案

import numpy as np 
import matplotlib.pyplot as plt 

t=np.array([ 
[ 0,0,0,0,0,0,0,0 ], 
[ 0,0,0,0,0,0,0,0 ], 
[ 0,0,2,0,0,4,0,0 ], 
[ 0,0,0,0,0,0,0,0 ], 
[ 0,0,0,0,0,0,0,0 ], 
[ 0,0,3,0,0,1,0,0 ], 
[ 0,0,0,0,0,0,0,0 ], 
[ 0,0,0,0,0,0,0,0 ]]) 


def spill(arr, nval=0, m=1): 
    narr=np.copy(arr) 
    for i in range(arr.shape[0]): 
     for j in range(arr.shape[1]): 
      if arr[i][j] != nval: 
       narr[i-m:i+m+1:1,j-m:j+m+1:1]=arr[i][j]      
    return narr 

l=spill(t) 
plt.figure() 
plt.pcolormesh(t) 
plt.savefig("notspilled.png") 
plt.figure() 
plt.pcolormesh(l) 
plt.savefig("spilled.png") 
plt.show() 

這種解決方案並沒有讓我非常開心,因爲雙for循環泄漏()函數中: -/

下面是最後的代碼

這個人是不是灑 Not spilled

這本是sppilled輸出:

spilled

我怎樣才能提高上面的代碼,以消除雙循環。

回答

1

你可以用2D卷積來做到這一點。例如:

from scipy.signal import convolve2d 

def spill2(arr, nval=0, m=1): 
    return convolve2d(arr, np.ones((2*m+1, 2*m+1)), mode='same') 

np.allclose(spill(t), spill2(t)) 
# True 

要知道,作爲寫,結果將不匹配,如果nval != 0或者溢出像素重疊,但你可能可以修改此來滿足您的需求。