2017-06-06 107 views
2

的NumPy的阵列集合标准偏差比方说,我有一个形状联合平均值和不同形状

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

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

是否可以用不同尺寸的尺寸做到这一点?或者在得到平均值和标准值之前我必须重新塑形?

+1

拼合,追加,计算 –

+0

如何为这些数组定义这些计算?不仅形状不同,而且元素的总数也是如此。 – hpaulj

+0

我想为std的平均值和一个值得到一个值。如果形状匹配,阵列将堆叠在另一个之上。 – Char

回答

3

我们可以使用standard deviationmean的公式来计算所有输入数组的这两个标量值,而不用连接/堆栈(特别是在大型NumPy数组上可能代价高昂)。让我们分步实现 - 意思是标准偏差,因为我们可以在std计算中使用mean

获取合并平均值:

因此,我们将开始与平均/平均。为此,我们将得到每个数组的总和标量。然后,获得总和,最后除以所有阵列中的元素数量。

获取综合标准偏差值:

对于标准的偏差,我们有公式为:

enter image description here

因此,我们将使用上一步得到的合成平均值,使用std公式得到平方微分,除以所有阵列中元素的总数,然后应用平方根。

实施

假设输入阵列ab,我们将有一个解决方案,像这样 - 验证

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 

N = float(a.size + b.size) 
mean_ = (a.sum() + b.sum())/N 
std_ = np.sqrt((((a - mean_)**2).sum() + ((b - mean_)**2).sum())/N) 

采样运行现在,为了验证,让我们堆叠起来然后使用相关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) 

样品运行 -

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 
+0

问题是我有很多数组(超过1,000),我想要得到组合的意思和标准。通常,我使用'combined = np.stack([arr for i in arrays])',然后调用combined.mean()和combined.std(),但是这里假定所有数组都可以堆叠。 – Char

+0

@Char查看最后的编辑。 – Divakar