【发布时间】:2020-08-10 08:05:09
【问题描述】:
我是 numpy 的新手,我正在尝试从 CSV 文件生成一个数组。我被告知 .genfromtxt 方法在生成数组以及自动检测和归属 dtype 方面效果很好。在我检查了数组的形状之前,这个公式似乎没有任何缺陷。
import numpy as np
taxi = np.genfromtxt("nyc_taxis.csv", delimiter=",", dtype = None, names = True)
taxi.shape
[out]: (89560,)
我相信这表明我的数据集现在是一维数组。我在课堂上学习的教程将taxi.shape 的最终结果设为(89560,15),但他们使用了一个冗长乏味的for 循环,然后将某些列转换为浮点数。但我想尝试学习一种更有效的方法。
数组的前几行是
array([(2016, 1, 1, 5, 0, 2, 4, 21. , 2037, 52. , 0.8, 5.54, 11.65, 69.99, 1),
(2016, 1, 1, 5, 0, 2, 1, 16.29, 1520, 45. , 1.3, 0. , 8. , 54.3 , 1),
(2016, 1, 1, 5, 0, 2, 6, 12.7 , 1462, 36.5, 1.3, 0. , 0. , 37.8 , 2),
(2016, 1, 1, 5, 0, 2, 6, 8.7 , 1210, 26. , 1.3, 0. , 5.46, 32.76, 1),
(2016, 1, 1, 5, 0, 2, 6, 5.56, 759, 17.5, 1.3, 0. , 0. , 18.8 , 2),
(2016, 1, 1, 5, 0, 4, 2, 21.45, 2004, 52. , 0.8, 0. , 52.8 , 105.6 , 1),
(2016, 1, 1, 5, 0, 2, 6, 8.45, 927, 24.5, 1.3, 0. , 6.45, 32.25, 1),
(2016, 1, 1, 5, 0, 2, 6, 7.3 , 731, 21.5, 1.3, 0. , 0. , 22.8 , 2),
(2016, 1, 1, 5, 0, 2, 5, 36.3 , 2562, 109.5, 0.8, 11.08, 10. , 131.38, 1),
(2016, 1, 1, 5, 0, 6, 2, 12.46, 1351, 36. , 1.3, 0. , 0. , 37.3 , 2)],
所以我可以从结果中看到每行有 15 个逗号分隔符(即 15 列),但形状告诉我它只有 89560 行,没有列。我读错了吗?有没有办法可以转换我的出租车数组数据集的形状以反映 csv 文件中的真实列数(即 15)?
感谢您的任何帮助
【问题讨论】:
-
查看
dtype。您有一个结构化数组,包含 89560 条记录和 15 个字段。您可以按名称访问字段。 -
np.lib.recfunctions.structured_to_unstructured可用于将结构化数组转换为二维非结构化(所有浮点数)数组。 -
感谢 cmets。如何按名称调用该字段?它是否类似于 pandas,我可以使用格式taxi.name_of_column 直接从数组中调用它?抱歉,我对此很陌生。
-
taxi['name_of_column']。在 pandas 中,您可以使用名称作为属性或索引键。对于结构化数组,您必须使用索引语法。如果您已经习惯使用pandas,您可能会发现使用pd.read_csv更容易。to_numpy或to_records可用于创建数组。 numpy.org/doc/stable/user/basics.rec.html -
你的建议被唤醒了。谢谢你。如果我可以再问一个问题?我使用了索引格式taxi['name_of_column'] 并选择了前5行的几列; ```taxi_5=taxi[:5] fare_comp=taxi_5['trip_length'][:],taxi_5['fare_amount'][:],taxi_5['fees_amount'][:] ```我想总结一下使用属性 array.sum(axis= 1 or 0) 跨两个轴(0 和 1)的值,但错误消息告诉我 fare_comp 对象是元组而不是数组。我尝试使用 sum(fare_comp) 函数,但它只添加列方向的值而不是行。
标签: arrays numpy parsing genfromtxt