2017-10-20 8 views
0

J'ai le problème suivant. J'ai un tableau 3D comme matrix = np.zeros((30,30,100)) où chaque entrée est une coordonnée et obtient une valeur. Donc matrix [0][0][0] est la coordonnée x = 0, y0, z = 0 et a une valeur de 0. Maintenant, je veux stocker toutes les valeurs dans un CSV comme ceci où les 3 premières lignes sont les coordonnées et le 4e la valeur correspondante:Python: Stockage des valeurs dans un tableau 3D à csv

enter image description here

est-il un moyen rapide avec numpy de le faire?

+0

D'où vient votre valeur correspondante? – vipertherapper

+0

Ils sont stockés dans un autre processus, mais pour cet exemple, il est également possible de stocker uniquement des zéros. – Varlor

+0

Est-ce que ce doit être un fichier csv? J'ai trouvé que np.save est plus utile pour enregistrer des tableaux ND en numpy. – BenT

Répondre

1

Vous pouvez utiliser des pandas, il peut à la fois remodeler le tableau et l'enregistrer en tant que csv.

import numpy as np 
import pandas as pd 
# create an example array 
a = np.arange(24).reshape([2,3,4]) 
# convert it to stacked format using Pandas 
stacked = pd.Panel(a.swapaxes(1,2)).to_frame().stack().reset_index() 
stacked.columns = ['x', 'y', 'z', 'value'] 
# save to disk 
stacked.to_csv('stacked.csv', index=False) 

Sinon, vous pouvez appliquer

np.ravel() 

à votre tableau et puis restaurer les indices à l'aide de l'une des recettes in this question.

0

J'imagine que vous obtenez les coordonnées avec les indices:

def iter_3D(matrix): 
    for i in range(matrix.shape[0]): 
     for j in range(matrix.shape[1]): 
      for k in range(matrix.shape[2]): 
       yield i, j, k 

l = [] 

for i, j, k in iter_3D(matrix): 
    l.append('%d %d %d %d' %(str(indices_x(i, j, k)), str(indices_y(i, j, k)), str(indices_z(i, j, k)), str(matrix[i, j, k])) 

with open('file.csv', 'w') as f: 
    f.write("\n".join(l)) 

Des solutions plus sophistiquées sont possibles, mais cela devrait être le noyau. Jetez un oeil à: csv io dans les docs python ou nditer si vous voulez une méthode d'itération plus sophistiquée ou utilisez pandas (prend un peu de temps pour obtenir le coup de sortir).