我们可以使用standard deviation 和mean 的公式来计算所有输入数组的这两个标量值,而无需连接/堆叠(这在大型 NumPy 数组上可能特别昂贵)。让我们分步进行 - 均值,然后是标准差,因为我们似乎可以在 std 计算中使用 mean。
获取组合平均值:
所以,我们将从均值/平均开始。为此,我们将获得每个数组的总和标量。然后,得到总和,最后除以所有数组中的元素个数。
获取组合标准差值:
对于标准差,我们的公式为:
因此,我们将使用从上一步获得的组合平均值,使用std 公式得到平方微分,除以所有数组的元素总数,然后应用平方根。
实施
假设输入数组是 a 和 b,我们会有一个解决方案,就像这样 -
N = float(a.size + b.size)
mean_ = (a.sum() + b.sum())/N
std_ = np.sqrt((((a - mean_)**2).sum() + ((b - mean_)**2).sum())/N)
用于验证的示例运行
In [266]: a = np.random.rand(3,4,2)
...: b = np.random.rand(2,5,3)
...:
In [267]: N = float(a.size + b.size)
...: mean_ = (a.sum() + b.sum())/N
...: std_ = np.sqrt((((a - mean_)**2).sum() + ((b - mean_)**2).sum())/N)
...:
In [268]: mean_
Out[268]: 0.47854757879348042
In [270]: std_
Out[270]: 0.27890341338373376
现在,为了验证,让我们堆叠然后使用相关的 ufunc -
In [271]: A = np.hstack((a.ravel(), b.ravel()))
In [273]: A.mean()
Out[273]: 0.47854757879348037
In [274]: A.std()
Out[274]: 0.27890341338373376
作为输入的数组列表
对于包含所有这些数组的列表,我们需要遍历它们,就像这样 -
A = [a,b,c] # input list of arrays
N = float(sum([i.size for i in A]))
mean_ = sum([i.sum() for i in A])/N
std_ = np.sqrt(sum([((i-mean_)**2).sum() for i in A])/N)
示例运行 -
In [301]: a = np.random.rand(3,4,2)
...: b = np.random.rand(2,5,3)
...: c = np.random.rand(7,4)
...:
In [302]: A = [a,b,c] # input list of arrays
...: N = float(sum([i.size for i in A]))
...: mean_ = sum([i.sum() for i in A])/N
...: std_ = np.sqrt(sum([((i-mean_)**2).sum() for i in A])/N)
...: print mean_, std_
...:
0.47703535428 0.293308550786
In [303]: A = np.hstack((a.ravel(), b.ravel(), c.ravel()))
...: print A.mean(), A.std()
...:
0.47703535428 0.293308550786