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:]]
很明显,您的协方差采样不足,并且协方差矩阵存在严重的秩次缺陷...
我有一个大小为 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:]]
很明显,您的协方差采样不足,并且协方差矩阵存在严重的秩次缺陷...