2014-05-25 3 views
5

Ich habe eine Reihe von Bildern, die in einer CVS-Datei als eine Zeichenfolge pro Bild gespeichert sind, die Zeichenfolge ist eine Liste von 9216 durch Leerzeichen getrennten Ganzzahlen. Ich habe eine Funktion, die dies in ein 96x96-Array konvertiert.Wie speichere ich ein numpy Array als Objekt in einem Pandas Datenrahmen?

Ich möchte dieses numpy Array in einer Spalte meines Datenrahmens anstelle der Zeichenfolge speichern.

Wenn ich jedoch das Element aus der Spalte abrufen, ist es nicht mehr als numpy Array verwendbar.

Daten können von hier heruntergeladen werden, die letzte Spalte in der Datei training.cvs.

https://www.kaggle.com/c/facial-keypoints-detection/data

import pandas as pd 
import numpy as np 

df_train = pandas.read_csv("training.csv") 

def convert_to_np_arr(im_as_str): 
    im = [int(i) for i in im_as_str.split()] 
    im = np.asarray(im) 
    im = im.reshape((96, 96)) 
    return im 

df_train['Im_as_np'] = df_train.Image.apply(convert_to_np_arr) 

im = df_train.Im_as_np[0] 
plt.imshow(im, cmap = cm.Greys_r) 
plt.show() 

Wenn stattdessen die Funktion der Verwendung und Anwendung und Speichern des Bildes, verwende ich den Code direkt als

import pandas as pd 
import numpy as np 

df_train = pandas.read_csv("training.csv") 

im = df_train.Image[0] 
im = [int(i) for i in im.split()] 
im = np.asarray(im) 
im = im.reshape((96, 96)) 

plt.imshow(im, cmap = cm.Greys_r) 
plt.show() 

Antwort

1

Die Art und Weise sollte es richtig sein, zu speichern erwartet funktioniert. Es ist nur schwieriger, auf Daten zuzugreifen. Statt im=df_train.Im_as_np[0]ix verwenden, um Daten zuzugreifen:

im=df_train.ix[0,'Im_as_np'] 
3

Pandas nicht dazu neigen, eine geeignete Datenstruktur für den Umgang mit Bildern zu sein. Im Allgemeinen ist die Annahme mit Pandas, dass die Anzahl der Spalten viel kleiner ist als die Anzahl der Zeilen. Dies muss natürlich nicht wahr sein, und für DataFrames, die in beiden Dimensionen klein sind, spielt es selten eine Rolle. Aber für mathematische Operationen, die in einem räumlichen Sinn natürlich sind, ist die relationale Struktur des DataFrame nicht geeignet, und dies zeigt sich, wenn die Anzahl der Spalten wächst. In Anbetracht dessen würde ich vorschlagen, einfach die csv-Lesefähigkeiten von NumPy zu verwenden und damit als 2D-Array oder ein Bildobjekt zu arbeiten, mit z.B. scikits.image.

Verwandte Themen