2017-03-03 2 views
0

J'ai un grand tableau 2D de taille Nx3. Ce tableau contient des données de nuage de points au format (X, Y, Z). J'utilise Python dans Ubuntu dans un environnement virtuel pour lire les données d'un fichier .ply.Numpy.Cov d'un grand tableau Nx3 produit MemoryError

Quand je suis en train de trouver la covariance de ce tableau avec rowvar ensemble à vrai (ce qui signifie chaque rangée étant considérée comme une variable), je reçois MemoryError. Je comprends que cela crée un très grand tableau, apparemment trop grand pour gérer ma mémoire allouée de 8 Go. Sans augmenter l'allocation de mémoire, existe-t-il un moyen différent de contourner ce problème? Existe-t-il différentes méthodes de calcul des éléments de la matrice de covariance afin que la mémoire ne soit pas surchargée?

+0

Quelle est la valeur de 'N'? – Eric

+0

La valeur de N peut être aussi grande que 23000. – troymyname00

+0

Veuillez poster votre code. De mon expérience, 8 Go devrait être suffisant – Marat

Répondre

1

Vous pouvez le couper en boucle et conserver uniquement le triangle supérieur.

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

Il est évident que votre covariances sera tout à fait et la matrice sous-échantillonnée de covariance très rang défectueux ...

+0

Pourquoi cela aide-t-il? Vous avez toujours alloué la matrice NxN – Eric

+0

@Eric Elle évite l'intermédiaire NxNx3 qui sur mon système fait la différence entre non faisable et juste faisable. –

+0

@Eric Je vois ce que vous voulez dire maintenant, comme c'est idiot de ma part. Pour sauver un peu de visage, je vais le mettre à jour pour utiliser le triangle supérieur seulement. –