Numpy.Cov 的大型 Nx3 阵列产生 MemoryError

Numpy.Cov of a Large Nx3 Array Produces MemoryError

我有一个大小为 Nx3 的大型二维数组。该数组包含 (X,Y,Z) 格式的点云数据。我在虚拟环境中使用 Ubuntu 中的 Python 从 .ply 文件中读取数据。

当我试图找到这个数组的协方差时 rowvar 设置为 True (意味着每一行都被认为是一个变量) , 我收到 MemoryError.

我知道这是在创建一个非常大的数组,对于我分配的 8 Gb 内存来说显然太大了,无法处理。在不增加内存分配的情况下,是否有其他方法可以解决此问题?是否有不同的计算协方差矩阵元素的方法,以免内存过载?

你可以把它切成一个循环,只保留上面的三角形。

import numpy as np

N = 23000
a = np.random.random((N, 3))
c = a - a.mean(axis=-1, keepdims=True)
out = np.empty((N*(N+1) // 2,))
def ravel_triu(i, j, n):
    i, j = np.where(i>j, np.broadcast_arrays(j, i), np.broadcast_arrays(i, j))
    return i*n - i*(i+1) // 2 + j
def unravel_triu(k, n):
    i = n - (0.5 + np.sqrt(n*(n+1) - 2*k - 1)).astype(int)
    return i, k - (i*n - i*(i+1) // 2)
ii, jj = np.ogrid[:N, :N]
for j in range(0, N, 500):
    out[ravel_triu(j, j, N):ravel_triu(min(N, j+500), min(N, j+500), N)] \
        = np.einsum(
            'i...k,...jk->ij', c[j:j+500], c[j:]) [ii[j:j+500] <= jj[:, j:]]

很明显,您的协方差采样不足,并且协方差矩阵存在严重的秩次缺陷...