我有一個大尺寸Nx3的二維數組。該陣列包含(X,Y,Z)格式的點雲數據。我在Ubuntu的虛擬環境中使用Python從.ply文件讀取數據。大Nx3陣列的Numpy.Cov產生內存錯誤
當我試圖用rowvar組找到這個陣的協方差真(指每行正在考慮一個變量),我得到的MemoryError。
據我所知,這是創建一個非常大的數組,顯然是我的8 Gb分配內存來處理太大。如果不增加內存分配,是否有解決此問題的不同方法?有沒有不同的方法來計算協方差矩陣元素,以便內存不會過載?
我有一個大尺寸Nx3的二維數組。該陣列包含(X,Y,Z)格式的點雲數據。我在Ubuntu的虛擬環境中使用Python從.ply文件讀取數據。大Nx3陣列的Numpy.Cov產生內存錯誤
當我試圖用rowvar組找到這個陣的協方差真(指每行正在考慮一個變量),我得到的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:]]
顯然你的協方差將是相當欠和協方差矩陣秩的高度缺陷...
這爲什麼幫助?您仍然分配了NxN矩陣 – Eric
@Eric它避免了在我的系統中導致不可執行和可行的區別的NxNx3中間件。 –
@Eric我現在明白你的意思了,我有多傻。爲了節省一點點面子,我會更新它只使用上三角。 –
什麼是'N'的價值? – Eric
N的值可能高達23000. – troymyname00
請發佈您的代碼。根據我的經驗,8Gb應該足夠了 – Marat