计算平均值& STD for Batch [Python / Numpy]

时间:2018-01-08 23:34:57

标签: python numpy tensorflow batch-processing channel

希望有效地计算批次中每个通道的平均值和STD。

详细说明:

  • 批量大小:128
  • 图片:32x32
  • 3个频道(RGB)

所以每批的大小都是[128,32,32,3]。

有很多批次(天然方法在所有批次中需要约4分钟)。

我想输出2个数组:( meanR,meanG,meanB)和(stdR,stdG,stdB)

(如果有一种有效的方法在计算后对批次执行算术运算,那么这将有所帮助。例如,从每个图像中减去整个数据集的平均值)

3 个答案:

答案 0 :(得分:1)

假设您想获得多轴的平均值(如果我没有弄错你)。如果axis是numpy.mean(a, axis=None)tuple已支持多轴均值。

我不太清楚天真的方法是什么意思。

答案 1 :(得分:1)

您可以使用此方法计算R,G,B的平均值和标准值。

a = np.random.rand(128,32,32,3)
for i in range(3):
    means = [m for m in np.mean(a, axis = (3, i))]
for i in range(3):
    stds = [s for s in np.std(a, axis = (3, i))]

虽然axis=(3,i) 3代表渠道,i代表颜色(R,G,B)。您也可以参考此链接。Get mean of 2D slice of a 3D array in numpy 。我希望这可以帮到你。

答案 2 :(得分:1)

如果我理解正确并且您想要计算所有图像的平均值和标准值:

演示:每个(2,2,3)形状的2个图像(为简单起见):

In [189]: a
Out[189]:
array([[[[ 1,  2,  3],
         [ 4,  5,  6]],

        [[ 7,  8,  9],
         [10, 11, 12]]],


       [[[13, 14, 15],
         [16, 17, 18]],

        [[19, 20, 21],
         [22, 23, 24]]]])

In [190]: a.shape
Out[190]: (2, 2, 2, 3)

In [191]: np.mean(a, axis=(0,1,2))
Out[191]: array([ 11.5,  12.5,  13.5])

In [192]: np.einsum('ijkl->l', a)/float(np.prod(a.shape[:3]))
Out[192]: array([ 11.5,  12.5,  13.5])

速度测量:

In [202]: a = np.random.randint(255, size=(128,32,32,3))

In [203]: %timeit np.mean(a, axis=(0,1,2))
9.48 ms ± 822 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [204]: %timeit np.einsum('ijkl->l', a)/float(np.prod(a.shape[:3]))
1.82 ms ± 22.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)