Skip to main content
 首页 » 编程设计

python之来自不同形状的 NumPy 数组集合的组合均值和标准差

2024年08月20日36hnrainll

假设我有带形状的 Numpy 数组

(682, 89, 138) 
(2668, 76, 89) 
(491, 62, 48) 

我应该如何计算所有三个数组的平均值和标准偏差?如果它们的形状相同,我可以使用 np.stack() 然后获取结果数组的均值和标准差。

是否可以使用不同尺寸的尺寸来做到这一点?或者我是否必须在获得均值和标准差之前进行整形?

请您参考如下方法:

我们可以使用 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 

现在,为了验证,让我们堆叠然后使用相关的 ufuncs -

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) 

sample 运行-

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