如何将numpy数组作为对象存储在pandas数据框中?

时间:2014-05-25 19:17:13

标签: python numpy pandas

我有一系列图像,每个图像存储在一个CVS文件中作为一个字符串,该字符串是一个9216空格分隔整数的列表。我有一个函数将其转换为96x96 numpy数组。

我希望将这个numpy数组存储在我的数据帧的一列而不是字符串中。

然而,当我从列中检索项目时,它不再可用作numpy数组。

数据可以从这里下载,即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()

如果不使用该功能并应用和存储图像,我直接使用代码按预期工作

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()

2 个答案:

答案 0 :(得分:3)

Pandas不一定是处理图像的合适数据结构。通常,Pandas的假设是列数远小于行数。这当然不一定是真的,对于两个维度都很小的DataFrame,它很少重要。但是对于空间意义上自然的数学运算,DataFrame的关系结构是不合适的,这显示了列数的增长。鉴于此,我建议只使用NumPy的csv读取功能,并将其作为二维数组或图像对象使用,例如scikits.image。

答案 1 :(得分:1)

存储方式应该是正确的。访问数据更加困难。而不是im=df_train.Im_as_np[0]使用ix来访问数据:

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