【问题标题】:Combined mean and standard deviation from a collection of NumPy arrays of different shapes来自不同形状的 NumPy 数组集合的组合均值和标准差
【发布时间】:2017-11-07 22:17:40
【问题描述】:

假设我有带有形状的 Numpy 数组

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

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

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

【问题讨论】:

  • 展平、追加、计算
  • 你将如何为这些数组定义这些计算,结合起来?不仅形状不同,元素的总数也不同。
  • 我想得到一个平均值和一个标准值。如果形状匹配,数组将堆叠在另一个之上。
  • @PaulH 对于如此大的 NumPy 数组来创建更大的数组,追加/堆叠/连接将是昂贵的。 OP 可能想避免这种情况。

标签: python numpy


【解决方案1】:

我们可以使用standard deviationmean 的公式来计算所有输入数组的这两个标量值,而无需连接/堆叠(这在大型 NumPy 数组上可能特别昂贵)。让我们分步进行 - 均值,然后是标准差,因为我们似乎可以在 std 计算中使用 mean

获取组合平均值:

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

获取组合标准差值:

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

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

实施

假设输入数组是 ab,我们会有一个解决方案,就像这样 -

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

【讨论】:

  • 问题是我有很多数组(超过 1,000 个),我想获得组合的均值和标准差。通常,我使用`combined = np.stack([arr for i in arrays])`,然后调用combined.mean()和combined.std(),但是这假设所有数组都可以堆叠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2023-03-21
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多