2017-03-03 16 views
0

我有一個大尺寸Nx3的二維數組。該陣列包含(X,Y,Z)格式的點雲數據。我在Ubuntu的虛擬環境中使用Python從.ply文件讀取數據。大Nx3陣列的Numpy.Cov產生內存錯誤

當我試圖用rowvar組找到這個陣的協方差(指每行正在考慮一個變量),我得到的MemoryError

據我所知,這是創建一個非常大的數組,顯然是我的8 Gb分配內存來處理太大。如果不增加內存分配,是否有解決此問題的不同方法?有沒有不同的方法來計算協方差矩陣元素,以便內存不會過載?

+0

什麼是'N'的價值? – Eric

+0

N的值可能高達23000. – troymyname00

+0

請發佈您的代碼。根據我的經驗,8Gb應該足夠了 – Marat

回答

1

你可以把它切成一個循環,只保留上三角形。

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:]] 

顯然你的協方差將是相當欠和協方差矩陣秩的高度缺陷...

+0

這爲什麼幫助?您仍然分配了NxN矩陣 – Eric

+0

@Eric它避免了在我的系統中導致不可執行和可行的區別的NxNx3中間件。 –

+0

@Eric我現在明白你的意思了,我有多傻。爲了節省一點點面子,我會更新它只使用上三角。 –