将NDarray列表转换为dataframe

时间:2016-11-17 18:15:49

标签: python pandas dataframe

我正在尝试将列表ND数组转换为数据帧,以便在其上执行Isomap。但这不会转换。任何人如何转换,以便我可以在上面做一个Isomap?

#Creation and filling of list samples*  
samples = list()  
for i in range(72):  
 img =misc.imread('Datasets/ALOI/32/32_r'+str(i*5)+'.png' )  
 samples.append(img)  
...  
df = pd.DataFrame(samples) #This doesn't work gives  
                           #ValueError: Must pass 2-d input*  
...  
iso = manifold.Isomap(n_neighbors=4, n_components=3)  
iso.fit(df) #The end goal of my DataFrame

3 个答案:

答案 0 :(得分:0)

很明显,不是吗?所有图像都是2D数据,行和列。将它们堆叠在一个列表中会使它获得第三个维度。 DataFrame本质上是2D。因此错误。

您有两种可能的修复方法:

创建Panel

wp = pd.Panel.from_dict(zip(samples, [str(i*5) for i in range(72)]))

将阵列一个堆叠在另一个上面,或并排堆叠:

# On top of another:
df = pd.concat([pd.DataFrame(sample) for sample in samples], axis=0,
               keys=[str(i*5) for i in range(72)])

# Side by side:
df = pd.concat([pd.DataFrame(sample) for sample in samples], axis=1,
               keys=[str(i*5) for i in range(72)])

答案 1 :(得分:0)

另一种方法是使用图像上的reshape方法将2D数组(图像)转换为1D数组(sklearn所期望的):

for i in range(yourRange):  
  img = misc.imread(yourFile)  
  samples.append(img.reshape(-1))
df = pd.DataFrame(samples)

答案 2 :(得分:0)

奥利维拉几乎拥有它。

问题

运行misc.imread时,输出为NxM(2D)数组。将其放入列表中,使其成为3D。 DataFrame需要2D输入。

修复

在进入列表之前,阵列应该使用ravel“展平”:

img =misc.imread('Datasets/ALOI/32/32_r'+str(i*5)+'.png' ).ravel()

为什么.reshape(-1)不起作用

重塑数组会保留数组的等级。而不是将它转换为Nx1数组,你希望它是Nx(无),这就是ravel()的作用。