【问题标题】:How to convert 1D numpy array (made using .genfromtxt() method) to a 2D array?如何将 1D numpy 数组(使用 .genfromtxt() 方法制作)转换为 2D 数组?
【发布时间】: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_numpyto_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


【解决方案1】:

您可以使用此功能将结构化转换为具有所需数据类型的非结构化(假设所有字段都是相同的数据类型,如果不是,则保持结构化更好):

import numpy.lib.recfunctions as rfn

taxi = rfn.structured_to_unstructured(taxi, dtype=np.float)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2021-05-27
    • 2023-03-14
    • 2017-11-02
    • 2017-07-29
    相关资源
    最近更新 更多