2017-03-03 11 views
0

私はサイズNx3の大きな2D配列を持っています。この配列には、(X、Y、Z)形式の点群データが含まれています。私は.plyファイルからデータを読み込むために、仮想環境のUbuntuでPythonを使用しています。私は(変数と見なされている各列の意味)にrowvarセットでこの配列の共分散を見つけようとしていますとき大きなNx3配列のNumpy.CovがMemoryErrorを生成します

、私はMemoryErrorを取得しています。

私はこれが非常に大きな配列を作成していることを理解しています。私の8Gb割り当てメモリが扱うには大きすぎます。メモリ割り当てを増やすことなく、この問題を回避する別の方法はありますか?メモリが過負荷にならないように共分散行列要素を計算する方法はいくつかありますか?

+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

@エリック私のシステム上では、NxNx3の中間が避けられます。 –

+0

@エリック私は今あなたの意見を見ています。ちょっと顔を保存するために、上の三角形のみを使用するように更新します。 –

関連する問題