我试图实现立方体形状(k,k)的2D滑动窗口,以便我可以在帧(n,m,3)上迭代并计算每个窗口中像素值的平均值. 我希望每次迭代,窗口将呈现下一张幻灯片没有任何重叠值; 即给出这个矩阵:

[
  [1, 2, 3, 4],
  [5, 6, 7 ,8],
  [9, 10, 11, 12],
  [13, 14, 15, 16]
 ]

对于k = 2 我会有一些东西如下:

 [
  [1, 2],
  [5, 6]
 ]

第二个窗口的值如下:

 [
  [3, 4],
  [7, 8]
 ]

我试过使用numpy. lib. stride_www.example.com_strided. 但没有任何成功

而且,使用numpy或任何其他有效的库也很重要,因为用python for循环实现代码对于该操作来说太昂贵了.

推荐答案

忽略第三个维度,既然它似乎不进入问题,如何:

# Generate array of size (m*k, n*k)
# my m, n are your m, n divided by k
m, n = 2, 4
k = 3
x = np.arange(m*n*k*k).reshape((m*k, n*k))
# array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
#        [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
#        [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],
#        [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47],
#        [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
#        [60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71]])

# Calculate means of each block
y = x.reshape((m, k, n, k))
z = np.moveaxis(y, -3, -2)  # now shape is (m, n, k, k) 
np.mean(z, axis=(-2, -1))  # take mean over last two axes
# or just np.mean(y, axis=(-3, -1)) 
# array([[13., 16., 19., 22.],
#        [49., 52., 55., 58.]])

为了保留第三维度并分别对每个 colored颜色 通道进行计算,只需在开始时将其移开(例如,移到轴0),然后在结束时将其移回.

如果行数和/或列数不能被k整除,则可以在数组中填充一些不会出现在数据中的哨兵值(例如nan),直到行数/列数可以被k整除.然后,以忽略哨兵值的方式取均值(例如nanmean).(或者,拆分剩余的行/列,分别处理它们,并合并结果.

可能有一些东西在scipy.ndimage或scikit—image,将完成这一行.我try 了zoom,但没有找到一个神奇的设置组合,以提供所需的结果.

Python相关问答推荐

分组数据并删除重复数据

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

我在使用fill_between()将最大和最小带应用到我的图表中时遇到问题

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

韦尔福德方差与Numpy方差不同

在线条上绘制表面

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

计算组中唯一值的数量

如何获取numpy数组的特定索引值?

Scrapy和Great Expectations(great_expectations)—不合作

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

如何指定列数据类型

在matplotlib中删除子图之间的间隙_mosaic

如何使用OpenGL使球体遵循Python中的八样路径?

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性:

数据框,如果值在范围内,则获取范围和

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

为什么Visual Studio Code说我的代码在使用Pandas concat函数后无法访问?

在MongoDB文档中仅返回数组字段

如何在基于时间的数据帧中添加计算值