【问题标题】:Load text file as strings using numpy.loadtxt()使用 numpy.loadtxt() 将文本文件作为字符串加载
【发布时间】:2021-08-03 17:45:56
【问题描述】:

我想将一个大文本文件(大约 1 GB,3*10^6 行和 10 - 100 列)加载为包含字符串的 2D np 数组。但是,似乎 numpy.loadtxt() 默认只采用浮点数。是否可以为整个数组指定另一种数据类型?我试过以下没有运气:

loadedData = np.loadtxt(address, dtype=np.str)

我收到以下错误消息:

/Library/Python/2.7/site-packages/numpy-1.8.0.dev_20224ea_20121123-py2.7-macosx-10.8-x86_64.egg/numpy/lib/npyio.pyc in loadtxt(fname, dtype, comments, delimiter, converters, skiprows, usecols, unpack, ndmin)
    833             fh.close()
    834
--> 835     X = np.array(X, dtype)
    836     # Multicolumn data are returned with shape (1, N, M), i.e.
    837     # (1, 1, M) for a single row - remove the singleton dimension there

ValueError: cannot set an array element with a sequence

有什么想法吗? (我事先不知道我的文件中的确切列数。)

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    np.loadtxt(file_path, dtype=str)

    【讨论】:

      【解决方案2】:

      Pandas中还有read_csv,速度快,支持非逗号列分隔符和按列自动输入:

      import pandas as pd
      df = pd.read_csv('your_file',sep='\t')
      

      如果你喜欢这种类型,它可以转换为 NumPy 数组:

      import numpy as np
      arr = np.array(df)
      

      这是迄今为止我遇到的最简单、最成熟的文本导入方法。

      【讨论】:

        【解决方案3】:

        您是否需要一个 NumPy 数组?否则,您可以通过将数据加载为嵌套列表来加快速度。

        def load(fname):
            ''' Load the file using std open'''
            f = open(fname,'r')
        
            data = []
            for line in f.readlines():
                data.append(line.replace('\n','').split(' '))
        
            f.close()
        
            return data
        

        对于 4000x4000 字的文本文件,这比 loadtxt 快大约 10 倍。

        【讨论】:

        • 如果将list obj在返回的时候转成ndarray,耗时差不多
        • 当然在这种情况下你不会节省时间。这就是我所说的第一句话,然后是 Otherwise :)
        【解决方案4】:

        请改用genfromtxt。比loadtxt更通用的方法:

        import numpy as np
        print np.genfromtxt('col.txt',dtype='str')
        

        使用文件col.txt

        foo bar
        cat dog
        man wine
        

        这给出了:

        [['foo' 'bar']
         ['cat' 'dog']
         ['man' 'wine']]
        

        如果您希望每行具有相同的列数,请读取第一行并设置属性filling_values 以修复任何缺失的行。

        【讨论】:

        • 谢谢!它工作正常,除了非常耗时。但据我所读,预计使用genfromtxt 而不是loadtxt。有什么办法可以加快速度吗?或者任何其他更快的方式来加载大量数据?
        • 如果您要一次又一次地使用数据集,您可能需要考虑原始文本文件以外的存储解决方案。我个人会选择 pytables 或其他 hd5f 解决方案。
        • 实际上,python 在尝试加载 800Mb 文本文件时会崩溃。它使用 8GB RAM 和 35GB Swap 填满内存。
        • 我用数据来训练一个分类器算法,所以只需要一次。
        • @Sigur 您必须在加载文件后执行此操作。如果您想使用pandas,如其他一些答案中所示,他们有这种东西的直接字符串方法。
        猜你喜欢
        • 2014-06-26
        • 2021-09-12
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        • 1970-01-01
        • 2015-04-05
        • 1970-01-01
        相关资源
        最近更新 更多