如何按单元格获取多个二维数组的标准偏差?
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 强制)。
我有 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 强制)。