在准备神经网络模型需要的训练数据时,经常需要构造顺手的数据形式,如下
特征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,用来在特征数据的基础上增加标签列。