如何通过单元格获得多个二维阵列的标准偏差



我有16个2d数组,每个数组的形状为[1600016000],这意味着一个数组有256000000个单元格。我想要一个std_array,它是16个数组中每个单元格的标准偏差。我尝试了一些东西,但失败了,我的问题是粗体的

这是我的尝试。例如(简化的3*3阵列(:

a = np.array([[1,2,3],[1,2,3],[1,2,3]])
b = np.array([[2,3,4],[2,3,4],[2,3,4]])
c = np.array([[3,4,5],[3,4,5],[3,4,5]])
stack = np.vstack((a,b,c))
var = np.std(stack, axis = 0)

然而,np.std函数只返回3个值,但我想要9个。我该怎么办

[0.81649658 0.81649658 0.81649658]

此外,当我在堆叠阵列上应用std时,我会得到这个错误。这只是意味着我的数组太大而无法操作吗

MemoryError: Unable to allocate array with shape (256000, 16000) and data type float32

在您的示例中,np.vstack((a,b,c))只需堆叠每个数组的所有行,即可得到以下结果:

array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[2, 3, 4],
[2, 3, 4],
[2, 3, 4],
[3, 4, 5],
[3, 4, 5],
[3, 4, 5]])

计算沿轴0或1的标准偏差不符合您的要求。

相反,您可以为每个数组添加一个新维度,以便将它们堆叠在一个新的维度中:

stack = np.vstack([a[None], b[None], c[None]])
stack.std(axis=2)

在这种情况下,stack是:

array([[[1, 2, 3],   <-- array `a`
[1, 2, 3],
[1, 2, 3]],
[[2, 3, 4],   <-- array `b`
[2, 3, 4],
[2, 3, 4]],
[[3, 4, 5],   <-- array `c`
[3, 4, 5],
[3, 4, 5]]])

结果是形状为(3,3)的2D阵列,其中基于分别来自3个阵列中的每一个的3个值来计算标准偏差。

问题是要构建一个巨大的数组,所以以后减少它对内存没有效率。相反,您可以对行进行迭代,以便构建更小的阵列:

result = np.empty(a.shape, dtype=np.float64)
for i in range(a.shape[0]):
stacked_line = np.vstack([a[i, None], b[i, None], c[i, None]])
result[i,:] = stacked_line.std(axis=0)

为了获得更高的性能,您可以使用Numba,从而避免创建许多构建和填充成本高昂的大数组(Numpy是必需的(。

最新更新