【问题标题】:How to count the elements in a Numpy stride-tricks blocks?如何计算 Numpy stride-tricks 块中的元素?
【发布时间】:2014-02-03 17:51:59
【问题描述】:

我正在研究从 400x400 大小的图像生成的 numpy stride-tricks 非重叠块。因此,要从图像中获得 40x40 块,单个块的大小将是 10x10 像素,因此,图像的最后一个像素将读取如下内容 - [39,39,9,9]。现在,问题是我想数数。完整的白色块,即如果在一个块中所有 10x10 像素都是 255,它将是一个白色块,所以 while-blocks 的数量会增加。我为此使用了一个非常简单但耗时的代码:

    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

有没有一种漂亮而有效的方法来做到这一点?或者任何可用的内置功能对此有所帮助?与我的其他代码相比,这段代码需要很长时间,所以我需要解决它...请帮助..谢谢

【问题讨论】:

    标签: python numpy


    【解决方案1】:

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

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

    如果您使用的是 numpy

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

    【讨论】:

    • 嗨 Jamie coll 技巧,说这个 axis=( a1, a2 ) 是否也适用于其他 numpy 函数?为什么选择负值?
    • 负轴索引表示它们是倒数第二个,axis=(2, 3) 在您的情况下将完全相同。所有还原 ufunc,例如sum, prod, mean,...,可以接受 axis 参数。
    • 谢谢,很高兴知道。你能告诉我(我们)这在内部是否也比在 pre numpy 1.7 风格中更有效?
    • 是的,因为替代方法是将多个调用链接到单个轴归约,并且每个调用都会创建一个中间数组。多轴调用时,一次生成最终结果,没有那些中间结果。
    猜你喜欢
    • 2018-04-03
    • 2019-09-12
    • 1970-01-01
    • 2015-10-08
    • 2012-01-11
    • 2015-10-08
    • 1970-01-01
    • 2015-07-16
    相关资源
    最近更新 更多