将CSV文件导入numpy为数据表时形状不正确

2 投票
3 回答
1409 浏览
提问于 2025-04-18 15:04

我正在尝试用numpy来读取一个CSV文件,把它当作数据表来用,但遇到了一些问题。

这是我的CSV文件的完整内容:

week,count,is_successful,percent,percent_tablet,percent_desktop
1,2005,0,23,32,45
1,3805,1,18,22,55
2,1872,0,35,22,43
2,2990,1,22,21,57
3,2005,0,24,24,48
3,3805,1,27,21,52

这是我写的numpy代码:

data = np.genfromtxt("data.csv", delimiter=',', names=True)
print data.shape

运行后我得到了(6,) - 它识别出了行,但没有列。为什么没有把它当作一个表格导入呢?

3 个回答

0

你可以使用 skiprows,而把 names 保持默认的 False 值。这样就可以跳过把数据整理成结构的步骤。

data = np.genfromtxt("data.csv", delimiter=',', skiprows=1)
print data.shape
0

来自文档

我们从文件中读取的字符串序列如何转换成其他类型,主要是通过设置dtype这个参数来控制。这个参数可以接受以下几种值:

  • 单一类型,比如dtype=float。这种情况下,输出会是一个二维数组,类型是你指定的dtype,除非你用names参数给每一列指定了名称(见下文)。需要注意的是,dtype=float是genfromtxt的默认设置。

  • 类型的序列,比如dtype=(int, float, float)。

  • 用逗号分隔的字符串,比如dtype="i4,f8,|S3"。

  • 一个包含两个键'names'和'formats'的字典。

  • 一个包含元组(name, type)的序列,比如dtype=[('A', int), ('B', float)]。

  • 一个已经存在的numpy.dtype对象。

  • 特殊值None。在这种情况下,列的类型会根据数据本身来决定(见下文)。

除了第一种情况,其他情况下输出的都是一个一维数组,且这个数组的dtype是结构化的。这个结构化的dtype有多少个字段就有多少个序列中的项。字段名称是通过names关键字来定义的。

简单来说,如果数据是混合的或者没有指定类型,你会得到一个包含不同类型的数组。只有当数据类型一致时,你才会得到一个矩阵。

2

当你有命名的列时,使用 genfromtxt 创建的数组是一个一维的 结构化数组。你可以通过列名来访问这些列,就像用钥匙打开门一样,比如 data['week']

你还可以用 view 方法获取数据的二维视图:table = data.view(np.float64).reshape(len(data), -1)

撰写回答