【问题标题】:Efficient way to process CSV file into a numpy array将 CSV 文件处理为 numpy 数组的有效方法
【发布时间】:2016-01-20 19:42:32
【问题描述】:

CSV 文件可能不干净(元素数量不一致的行),需要忽略不干净的行。 处理过程中需要对字符串进行操作。

示例输入:

20150701 20:00:15.173,0.5019,0.91665

期望的输出:float32(伪日期,一天中的秒数,f3,f4)

0.150701 72015.173 0.5019 0.91665 (+ the trailing trash floats usually get)

CSV 文件也很大,内存中的 numpy 数组预计会占用 5-10 GB,CSV 文件超过 30GB。

寻找一种有效的方法来处理 CSV 文件并最终得到一个 numpy 数组。

当前解决方案:使用 csv 模块,逐行处理并使用 list() 作为缓冲区,稍后使用 asarray() 将其转换为 numpy 数组。问题是,在翻转过程中,内存消耗增加了一倍,并且复制过程增加了执行开销。

Numpy 的 genfromtxt 和 loadtxt 似乎无法按需要处理数据。

【问题讨论】:

标签: python arrays csv numpy genfromtxt


【解决方案1】:

如果您事先知道数据中有多少行,则可以省去中间的list,直接写入数组。

import numpy as np

no_rows = 5
no_columns = 4

a = np.zeros((no_rows, no_columns), dtype = np.float)

with open('myfile') as f:
    for i, line in enumerate(f):
        a[i,:] = cool_function_that_returns_formatted_data(line)

【讨论】:

  • 除非它是磁带驱动器,否则计算行数是微不足道的,我希望在 python 中有某种方法可以使用可以扩展的缓冲区,然后将其视为 numpy 数组,但如果你的解决方案失败了想到了,前提是坏线的数量不多,效率很高。
  • @dingrite - 您必须在将字符串数据放入数组之前对其进行处理,并且我知道存在无法处理数据的两个副本的内存限制。因此,您似乎需要分块处理数据并添加到现有数组中。您是否按照其他人的建议尝试了pandas 解决方案?也许在 IO 模块或mmap 中有一种方法,我真的不太明白。
【解决方案2】:

您是否考虑过使用 pandas read_csv (with engine='C')

我发现它是处理 csv 的最佳且最简单的解决方案之一。我使用 4GB 文件,它对我有用。

import pandas as pd
df=pd.read_csv('abc.csv',engine='C')
print(df.head(10))

【讨论】:

    【解决方案3】:

    我认为i/o capability of pandas 是将数据放入 numpy 数组的最佳方式。具体来说,read_csv 方法将读入 pandas DataFrame。然后,您可以使用返回的 DataFrameas_matrix 方法访问底层 numpy 数组。

    【讨论】:

    • 你能举个例子吗?除了 out=None 的示例之外,该文档没有显示任何其他内容。我认为它应该看起来像 np.divide(train_inputs, 255, out=train_inputs),没有返回值。但我收到一个错误:TypeError: No loop matching the specified signature and cast
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2022-12-07
    • 2021-01-03
    • 2020-02-11
    • 1970-01-01
    相关资源
    最近更新 更多