如何按单元格获取多个二维数组的标准偏差?

How to get standard deviation across multiple 2d arrays by cell?

我有 16 个二维数组,每个数组的形状都是 [16000, 16000],这意味着一个数组有 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函数只有returns3个值,但是我想要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) 的二维数组,其中标准偏差是根据分别来自 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 强制)。