2016-03-02 44 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或者溢出像素重叠,但你可能可以修改此来满足您的需求。