网络训练需要的混合类型数据的组织方式

在准备神经网络模型需要的训练数据时,经常需要构造顺手的数据形式,如下

特征1 特征2 特征3 特征n 标签
37.584 37.632 38.045 38.902 ‘a’
33.216 39.193 42.887 44.917 ‘b’
31.747 32.359 33.127 33.687 ‘c’
34.268 35.169 36.632 38.900 ‘d’

用什么样的数据类型来组织以上数据呢?有四种选择

  • python 的二维列表 list

  • python 的字典结构 dict

  • numpy 的二维数组 array

  • pandas 的 DataFrame 结构

python 的 list 结构

很显然,这种数据组织成二维列表是不合适的,无法切片,本质上是列表中嵌套列表的结构。接下来详细介绍用 numpy 的 array 和 pandas 的DataFrame 结构。

python 的字典结构 dict

存成字典结构方便存取,如果特征列数据都是浮点数据,也需要借助 numpy 的 array 来实现。

numpy 的 array 结构

如果组织成二维数组 array 结构,由于特征列和标签列中的数据类型可能会出现字符型数据,那数组类型将必须设置成混合类型。即初始化特征数据时选择 dtype = object,然后将特征列表,使用列堆叠(column_stack)追加到最后一列即可。

data_array = np.array(data,dtype=object)
data_label_array = np.column_stack((data_array,label))

最终效果如下

data_label_array: [[37.584 37.632 38.045 38.902 ‘a’]
[33.216 39.193 42.887 44.917 ‘b’]
[31.747 32.359 33.127 33.687 ‘c’]
[34.268 35.169 36.632 38.9 ‘d’]]

如果初始化数据时选择 dtype = float 或 np.float64 时会怎样呢?

data_label_array: [[‘37.584’ ‘37.632’ ‘38.045’ ‘38.902’ ‘a’]
[‘33.216’ ‘39.193’ ‘42.887’ ‘44.917’ ‘b’]
[‘31.747’ ‘32.359’ ‘33.127’ ‘33.687’ ‘c’]
[‘34.268’ ‘35.169’ ‘36.632’ ‘38.9’ ‘d’]]

那么在追加标签列时,会将浮点类型的特征数据转化为字符型数据。这样的效果显然不是我们想要的。

pandas 的 DataFrame 结构

有两种方式,一种是将特征列数据放入某一个字段里,比如data,同时标签列放入label字段里。另一种方式,特征列有多少列就存多少个字段,label同样单独一个字段。如

df: [[37.584 37.632 38.045 38.902 ‘a’]
[33.216 39.193 42.887 44.917 ‘b’]
[31.747 32.359 33.127 33.687 ‘c’]
[34.268 35.169 36.632 38.9 ‘d’]]

这样,浮点类型的特征数据也是没办法设置成np.float64类型的,只能是python原生的float类型。

全部代码如下

import os
import pandas as pd
import numpy as np

def test():
    a_data = [37.584,37.632,38.045,38.902]
    b_data = [33.216,39.193,42.887,44.917]
    c_data = [31.747,32.359,33.127,33.687]
    d_data = [34.268,35.169,36.632,38.900]
    a_label = 'a'
    b_label = 'b'
    c_label = 'c'
    d_label = 'd'
    
    data =  [a_data,b_data,c_data,d_data]
    label = [a_label,b_label,c_label,d_label]
    print("####list####")
    print('data:',data)
    print('label:',label)
    print("####array####")
    data_array = np.array(data,dtype=float)
    data_label_array = np.column_stack((data_array,label))
    print('data_array:',data_array)
    print('data_label_array:',data_label_array)
    print("####DataFrame####")
    df = pd.DataFrame(data_array)
    df['label'] = label
    print('df:',df.values)


if __name__ == '__main__':
    test()

总结

  • 二维混合类型的数据组织,可以设置为 dict,numpy 的 array,pandas 的 DataFrame,但是不要组织为二维列表。
  • numpy 的 cloumn_stack,用来在特征数据的基础上增加标签列。

参考文档

Python中numpy数组的拼接、合并

你可能感兴趣的:(python,numpy)