【问题标题】:Dump a NumPy array into a csv file将 NumPy 数组转储到 csv 文件中
【发布时间】:2011-08-30 04:12:29
【问题描述】:

有没有办法将 NumPy 数组转储到 CSV 文件中?我有一个 2D NumPy 数组,需要以人类可读的格式转储它。

【问题讨论】:

    标签: python arrays csv numpy


    【解决方案1】:

    为了将 NumPy 数组存储到文本文件中,首先从 Numpy 模块导入 savetext

    考虑你的 Numpy 数组名称是 train_df

    from numpy import savetxt
    np.savetxt('train_df.txt', train_df, fmt='%s')
    

    【讨论】:

    • 由于您调用的是np.savetext(...,因此您不需要导入调用from numpy import savetxt。如果您确实导入它,您可以简单地将其称为savetext(...
    【解决方案2】:

    将记录数组写入带有标题的 CSV 文件需要更多的工作。

    此示例从 CSV 文件 (example.csv) 读取数据并将其内容写入另一个 CSV 文件 (out.csv)。

    import numpy as np
    
    # Write an example CSV file with headers on first line
    with open('example.csv', 'w') as fp:
        fp.write('''\
    col1,col2,col3
    1,100.1,string1
    2,222.2,second string
    ''')
    
    # Read it as a Numpy record array
    ar = np.recfromcsv('example.csv', encoding='ascii')
    print(repr(ar))
    # rec.array([(1, 100.1, 'string1'), (2, 222.2, 'second string')], 
    #           dtype=[('col1', '<i8'), ('col2', '<f8'), ('col3', '<U13')])
    
    # Write as a CSV file with headers on first line
    with open('out.csv', 'w') as fp:
        fp.write(','.join(ar.dtype.names) + '\n')
        np.savetxt(fp, ar, '%s', ',')
    

    请注意,上面的示例无法处理带有逗号的字符串值。要始终将非数字值括在引号内,请使用 csv 内置模块:

    import csv
    
    with open('out2.csv', 'w', newline='') as fp:
        writer = csv.writer(fp, quoting=csv.QUOTE_NONNUMERIC)
        writer.writerow(ar.dtype.names)
        writer.writerows(ar.tolist())
    

    【讨论】:

    • 这就是 pandas 再次提供帮助的地方。你可以这样做:pd.DataFrame(out, columns=['col1', 'col2']) 等
    【解决方案3】:

    我相信你也可以很简单地做到这一点:

    1. 将 Numpy 数组转换为 Pandas 数据帧
    2. 另存为 CSV

    例如#1:

        # Libraries to import
        import pandas as pd
        import nump as np
    
        #N x N numpy array (dimensions dont matter)
        corr_mat    #your numpy array
        my_df = pd.DataFrame(corr_mat)  #converting it to a pandas dataframe
    

    例如#2:

        #save as csv 
        my_df.to_csv('foo.csv', index=False)   # "foo" is the name you want to give
                                               # to csv file. Make sure to add ".csv"
                                               # after whatever name like in the code
    

    【讨论】:

    【解决方案4】:

    您可以使用pandas。它确实需要一些额外的内存,因此并不总是可行,但它非常快速且易于使用。

    import pandas as pd 
    pd.DataFrame(np_array).to_csv("path/to/file.csv")
    

    如果您不想要标题或索引,请使用to_csv("/path/to/file.csv", header=None, index=None)

    【讨论】:

    • 不过这也会在第一行写入列索引。
    • @RM- 你可以使用df.to_csv("file_path.csv", header=None)
    • 不好。这会创建一个 df 并消耗额外的内存
    • 工作起来就像魅力,它非常快 - 以额外的内存使用为代价。参数header=None, index=None删除标题行和索引列。
    • @DaveC : 您必须将 comments 关键字参数设置为 ''# 将被禁止。
    【解决方案5】:

    在 Python 中,我们使用 csv.writer() 模块将数据写入 csv 文件。该模块类似于 csv.reader() 模块。

    import csv
    
    person = [['SN', 'Person', 'DOB'],
    ['1', 'John', '18/1/1997'],
    ['2', 'Marie','19/2/1998'],
    ['3', 'Simon','20/3/1999'],
    ['4', 'Erik', '21/4/2000'],
    ['5', 'Ana', '22/5/2001']]
    
    csv.register_dialect('myDialect',
    delimiter = '|',
    quoting=csv.QUOTE_NONE,
    skipinitialspace=True)
    
    with open('dob.csv', 'w') as f:
        writer = csv.writer(f, dialect='myDialect')
        for row in person:
           writer.writerow(row)
    
    f.close()
    

    分隔符是用于分隔字段的字符串。默认值为逗号(,)。

    【讨论】:

    【解决方案6】:

    如前所述,将数组转储到 CSV 文件的最佳方法是使用.savetxt(...)method。但是,我们应该知道一些事情才能正确地做到这一点。

    例如,如果您有一个带有dtype = np.int32 的 numpy 数组

       narr = np.array([[1,2],
                     [3,4],
                     [5,6]], dtype=np.int32)
    

    并希望使用savetxt 保存

    np.savetxt('values.csv', narr, delimiter=",")
    

    它将浮点指数格式的数据存储为

    1.000000000000000000e+00,2.000000000000000000e+00
    3.000000000000000000e+00,4.000000000000000000e+00
    5.000000000000000000e+00,6.000000000000000000e+00
    

    您必须使用名为fmt as 的参数来更改格式

    np.savetxt('values.csv', narr, fmt="%d", delimiter=",")
    

    以原始格式存储数据

    以压缩的 gz 格式保存数据

    此外,savetxt 可用于以.gz 压缩格式存储数据,这在通过网络传输数据时可能很有用。

    我们只需要将文件的扩展名更改为.gz,numpy 会自动处理所有事情

    np.savetxt('values.gz', narr, fmt="%d", delimiter=",")
    

    希望对你有帮助

    【讨论】:

    • fmt="%d" 是我想要的。谢谢!
    【解决方案7】:

    tofile 是一个方便的函数:

    import numpy as np
    a = np.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
    a.tofile('foo.csv',sep=',',format='%10.5f')
    

    手册页有一些有用的注释:

    这是一个方便快速存储数组数据的功能。 关于字节顺序和精度的信息丢失了,所以这种方法不是 用于归档数据或传输数据的文件的理想选择 在具有不同字节顺序的机器之间。其中一些问题可以 通过将数据输出为文本文件来克服,代价是 速度和文件大小。

    注意。此函数不会生成多行 csv 文件,它会将所有内容保存到一行。

    【讨论】:

    • 据我所知,这不会生成 csv 文件,而是将所有内容放在一行中。
    • @Peter,好点,谢谢,我已经更新了答案。对我来说,它确实可以保存为 csv 格式(尽管仅限于一行)。此外,很明显提问者的意图是“以人类可读的格式转储它” - 所以我认为答案是相关且有用的。
    • 从 1.5.0 版开始,np.tofile() 采用可选参数 newline='\n' 来允许多行输出。 docs.scipy.org/doc/numpy-1.13.0/reference/generated/…
    • 实际上,np.savetext() 提供了换行参数,而不是 np.tofile()
    【解决方案8】:

    你也可以用纯python来做,不使用任何模块。

    # format as a block of csv text to do whatever you want
    csv_rows = ["{},{}".format(i, j) for i, j in array]
    csv_text = "\n".join(csv_rows)
    
    # write it to a file
    with open('file.csv', 'w') as f:
        f.write(csv_text)
    

    【讨论】:

    • 这会占用大量内存。更喜欢遍历每一行并格式化和写入它。
    • @remram 这取决于你的数据,但是如果它很大,它会占用大量内存
    【解决方案9】:

    numpy.savetxt 将数组保存到文本文件中。

    import numpy
    a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
    numpy.savetxt("foo.csv", a, delimiter=",")
    

    【讨论】:

    • 这是否比按维度循环遍历数组更可取?我猜是的。
    • 您还可以使用 fmt 关键字更改每个图形的格式。默认是 '%.18e',这可能很难阅读,你可以使用 '%.3e' 所以只显示 3 位小数。
    • 安德里亚,是的,我使用了 %10.5f。这很方便。
    • 您的方法适用于数值数据,但它会引发numpy.array 的字符串错误。您能否为包含字符串的 numpy.array 对象指定一种另存为 csv 的方法?
    • @ÉbeIsaac 您也可以将格式指定为字符串:fmt='%s'
    【解决方案10】:

    如果你想写在专栏里:

        for x in np.nditer(a.T, order='C'): 
                file.write(str(x))
                file.write("\n")
    

    这里 'a' 是 numpy 数组的名称,'file' 是要写入文件的变量。

    如果要连续写:

        writer= csv.writer(file, delimiter=',')
        for x in np.nditer(a.T, order='C'): 
                row.append(str(x))
        writer.writerow(row)
    

    【讨论】:

      【解决方案11】:

      如果你想将你的 numpy 数组(例如your_array = np.array([[1,2],[3,4]]))保存到一个单元格中,你可以先用your_array.tolist() 转换它。

      然后以正常方式将其保存到一个单元格,delimiter=';' csv 文件中的单元格将如下所示[[1, 2], [2, 4]]

      然后你可以像这样恢复你的数组: your_array = np.array(ast.literal_eval(cell_string))

      【讨论】:

      • 嗯,这实际上会破坏使用 numpy 数组所节省的所有内存
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 2020-02-22
      • 2019-12-07
      • 2021-03-01
      • 2017-11-02
      • 2017-01-15
      相关资源
      最近更新 更多