如何计算Numpy stride-tricks块中的元素?

时间:2014-02-03 17:52:00

标签: python numpy

我正在研究numpy stride-tricks非重叠块,它们是从大小为400x400的图像生成的。因此,为了从图像中获得40x40块,单个块的大小将是10x10像素,因此,图像的最后一个像素将读取如下所示 - [39,39,9,9]。现在,问题在于我想算不上。完整的白色块,即如果在一个块中所有10x10像素都是255,那么它将是一个白色块,因此while块的计数会增加。我在时间消耗代码方面使用了一个非常简单但代价高昂的代码:

    blocks = numpy.lib.stride_tricks.as_strided(image, shape=shape, strides=strides)    
    counter = 0 ##### Counting the white blocks
    for i in range(40): 
        for j in range(40):
          c = 0
          for k in range(10):
             for l in range(10):
                if blocks[i,j,k,l] ==255:
                  c = c + 1
           if c ==100:
              counter = counter +1

有一种漂亮而有效的方法吗?或者任何可用的内置功能对此有帮助?与我的其余代码相比,这段代码需要很长时间,所以我需要一个解决方法... plz help..thanks

1 个答案:

答案 0 :(得分:2)

您的块没有重叠,因此不存在生成巨大中间阵列的真正风险。只需在布尔数组的最后两个轴上调用np.all,将图像与255

进行比较
np.count_nonzero((blocks == 255).all(axis=(-1, -2)))

如果你正在使用numpy< 1.7然后你必须这样做:

np.count_nonzero((blocks == 255).all(axis=-2).all(axis=-1))