如何使用 genfromtxt 加载包含字符串和数字的 csv 文件?

pra*_*gma 3 python numpy genfromtxt

我正在尝试在 NumPy 数组中加载一个 csv 文件以进行机器学习。到目前为止,我一直使用 int 或 float 数据,但我当前的 csv 包含 string、float 和 int,所以我在 dtype 参数方面遇到了一些麻烦。我的数据集有 41188 个样本和 8 个特征,例如:

47;"university.degree";"yes";176;1;93.994;-36.4;4.857;"no"
Run Code Online (Sandbox Code Playgroud)

我知道如果我指定 dtype=None 类型将由每列的内容确定:

data = np.genfromtxt(filename, dtype=None, delimiter=";", skip_header=1)
Run Code Online (Sandbox Code Playgroud)

但它显然不起作用。首先, genfromtxt 的结果是一个具有以下形状的 numpy ndarray:

In [2]: data.shape
Out[2]: (41188,)
Run Code Online (Sandbox Code Playgroud)

虽然我期待 (41188,8)

相反,如果我使用默认的 dtype:

data2 = np.genfromtxt(filename, delimiter=";", skip_header=1)
Run Code Online (Sandbox Code Playgroud)

我获得以下数据形状:

In [4]: data2.shape
Out[4]: (41188,8)
Run Code Online (Sandbox Code Playgroud)

其次,使用 dtype=None 我获得以下弃用警告:

VisibleDeprecationWarning: Reading unicode strings without specifying the encoding argument is deprecated. Set the encoding, use None for the system default.
Run Code Online (Sandbox Code Playgroud)

我可以通过使用来修复(是否正确?):

encoding='ASCII'
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 如何设置每列的正确类型?
  2. 为什么我必须设置编码?

hpa*_*ulj 5

带有 2 个样本线副本:

In [140]: data = np.genfromtxt(txt, dtype=None, delimiter=';', encoding=None)
In [141]: data
Out[141]: 
array([(47, '"university.degree"', '"yes"', 176, 1, 93.994, -36.4, 4.857, '"no"'),
       (47, '"university.degree"', '"yes"', 176, 1, 93.994, -36.4, 4.857, '"no"')],
      dtype=[('f0', '<i8'), ('f1', '<U19'), ('f2', '<U5'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<U4')])
In [142]: data.shape
Out[142]: (2,)
In [143]: data.dtype
Out[143]: dtype([('f0', '<i8'), ('f1', '<U19'), ('f2', '<U5'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<U4')])
Run Code Online (Sandbox Code Playgroud)

这是一个普通的结构化数组 -data是一个具有 8 个字段的一维数组。这些字段dtype与每列共有的浮点数、整数或字符串类型相匹配。

您可以按名称而不是列号访问字段:

In [144]: data['f0']
Out[144]: array([47, 47])
In [145]: data['f1']
Out[145]: array(['"university.degree"', '"university.degree"'], dtype='<U19')
Run Code Online (Sandbox Code Playgroud)

请注意,我包含了encoding=None. 我不完全确定何时需要这样做,但很容易包含在内。