相关疑难解决方法(0)

如何在类似于Matlab的blkproc(blockproc)函数的块中有效地处理numpy数组

我正在寻找一种有效的方法来有效地将图像分成小区域,分别处理每个区域,然后将每个过程的结果重新组合成单​​个处理过的图像.Matlab有一个名为blkproc的工具(blockproc在较新版本的Matlab中取代).

在理想世界中,函数或类也支持输入矩阵中的分区之间的重叠.在Matlab帮助中,blkproc定义为:

B = blkproc(A,[mn],[mborder nborder],有趣,...)

  • A是你的输入矩阵,
  • [mn]是块大小
  • [mborder,nborder]是边界区域的大小(可选)
  • fun是一个应用于每个块的函数

我已经采取了一种方法,但它让我觉得笨拙,我敢打赌,这是一个更好的方法.冒着我自己的尴尬,这是我的代码:


import numpy as np

def segmented_process(M, blk_size=(16,16), overlap=(0,0), fun=None):
    rows = []
    for i in range(0, M.shape[0], blk_size[0]):
        cols = []
        for j in range(0, M.shape[1], blk_size[1]):
            cols.append(fun(M[i:i+blk_size[0], j:j+blk_size[1]]))
        rows.append(np.concatenate(cols, axis=1))
    return np.concatenate(rows, axis=0)

R = np.random.rand(128,128)
passthrough = lambda(x):x
Rprime = segmented_process(R, blk_size=(16,16), 
                           overlap=(0,0), 
                           fun=passthrough)

np.all(R==Rprime)
Run Code Online (Sandbox Code Playgroud)

python matlab numpy image-processing scipy

25
推荐指数
3
解决办法
1万
查看次数

如何更粗糙的二维阵列数据分辨率

我在这里有类似的问题
这个问题与tiff数据类似,我想找到一种更通用的方法来处理它.

我的问题

例如:

  • 形状为200x150的2维numpy阵列表示1 km x 1 km分辨率的人口密度数据.

http://i4.tietuku.com/060fe38e9ccf6daf.png

  • 我的目标:改变空间分辨率=> 5 km x 5 km分辨率

这是随机分布式数据集群到网格网络的示例图片 http://i4.tietuku.com/a4c1355413f8cdbc.png
*红点:原始数据
*蓝点:网格表示二维数组*绿色圆圈:找到每个红点最近的蓝点并求它们.
*在这个问题中,区别在于原始数据也是2-d numpy数组.

我的解决方案

  • 与我在这里的另一个问题类似,我将2-d散点指向最近的网格点.我很欣赏@HYRY支持的答案,它改进了我的代码.

  • 在那个问题中,我使用KD树算法来查找每个原始点数据的最近网络节点.结果显示在这里:http:
    //i4.tietuku.com/1a420c48ed7bcb1c.png

  • 我认为必须有一些更简单的方法来重塑结构化的2-d numpy数组而不是随机的2-d散点.

添加2016-01-09

感谢@Praveen的回答.
我有另一种使用scipy interpolate 2d函数的方法.

这是我的代码:

 xi  = np.linspace(x_map1,x_map2,pop.shape[1])
 yi  = np.linspace(y_map1,y_map2,pop.shape[0])
 hfunc = interpolate.interp2d(xi,yi,pop)

 x_grid  = np.linspace(x_map1,x_map2,new_shape_x)
 y_grid  = np.linspace(y_map1,y_map2,new_shape_y)

 new_pop = np.zeros(new_shape_x * new_shape_y)
 t = 0
 for i in range(0,new_shape_y,1):
     for j in range(0,new_shape_y,1):
         new_pop[t] = hfunc(x_grid[j],y_grid[i])
         t+=1
 new_pop = …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy matplotlib

4
推荐指数
1
解决办法
1771
查看次数

标签 统计

numpy ×2

python ×2

arrays ×1

image-processing ×1

matlab ×1

matplotlib ×1

scipy ×1