希望有效地计算批次中每个通道的平均值和STD。
详细说明:
所以每批的大小都是[128,32,32,3]。
有很多批次(天然方法在所有批次中需要约4分钟)。
我想输出2个数组:( meanR,meanG,meanB)和(stdR,stdG,stdB)
(如果有一种有效的方法在计算后对批次执行算术运算,那么这将有所帮助。例如,从每个图像中减去整个数据集的平均值)
答案 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)