将NumPy数组转储到csv文件中

Dex*_*ter 482 python csv arrays numpy

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

Jim*_*som 769

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

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

  • 您还可以使用fmt关键字更改每个数字的格式.默认为'%.18e',这可能难以阅读,您可以使用'%.3e',因此只显示3位小数. (41认同)
  • 你的方法适用于数值数据,但它会为`numpy.array`字符串抛出一个错误.你能为一个包含字符串的`numpy.array`对象保存为csv的方法吗? (11认同)
  • @ÉbeIsaac您也可以将格式指定为字符串:`fmt ='%s'` (11认同)
  • Andrea,是的,我使用%10.5f.这很方便. (3认同)
  • 这是否优先于按维度循环遍历数组?我猜是这样的. (2认同)
  • 当 scipy 文档说分隔符是分隔列的字符或字符串时,它是什么意思?当我使用 savetxt() 时,它会将所有内容都扔到同一列中。另外,我们如何以 .tsv 格式保存?我们使用 4 个空格吗?scipy 文档根本没有涉及 .tsv ,但是 .tsv 是一种常见的格式,必须有办法。有什么想法吗? (2认同)

max*_*lec 111

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

import pandas as pd 
pd.DataFrame(np_array).to_csv("path/to/file.csv")
Run Code Online (Sandbox Code Playgroud)

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

  • 像魅力一样工作,它非常快 - 额外的内存使用权衡.参数`header = None,index = None`删除标题行和索引列. (18认同)
  • @ RM-你可以使用`df.to_csv("file_path.csv",header = None)` (5认同)
  • 但是,这也将在第一行中写入列索引. (4认同)
  • 不好.这会创建一个df并消耗额外的内存 (3认同)
  • @DaveC:你必须将`comments`关键字参数设置为`''`,```将被抑制. (3认同)

ato*_*3ls 40

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')
Run Code Online (Sandbox Code Playgroud)

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

这是一种便于快速存储阵列数据的功能.有关字节序和精度的信息会丢失,因此对于要在具有不同字节序的计算机之间存档数据或传输数据的文件,此方法不是一个好的选择.通过以速度和文件大小为代价将数据输出为文本文件,可以克服其中一些问题.

注意.此功能不会生成多行csv文件,它会将所有内容保存到一行.

  • 据我所知,这不会产生一个csv文件,但将所有内容放在一行上. (5认同)
  • 从版本1.5.0开始,np.tofile()采用可选参数newline ='\n'来允许多行输出.https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.savetxt.html (5认同)
  • 实际上,np.savetext()提供换行参数,而不是np.tofile() (2认同)

Mik*_*e T 13

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

此示例读取带有第一行标题的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')
print(repr(ar))
# rec.array([(1, 100.1, 'string1'), (2, 222.2, 'second string')], 
#           dtype=[('col1', '<i4'), ('col2', '<f8'), ('col3', 'S13')])

# 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', ',')
Run Code Online (Sandbox Code Playgroud)

请注意,此示例不考虑带逗号的字符串.要考虑非数字数据的引号,请使用csv包:

import csv

with open('out2.csv', 'wb') as fp:
    writer = csv.writer(fp, quoting=csv.QUOTE_NONNUMERIC)
    writer.writerow(ar.dtype.names)
    writer.writerows(ar.tolist())
Run Code Online (Sandbox Code Playgroud)

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

小智 10

要将 NumPy 数组存储到文本文件,请savetxt从 NumPy 模块导入

考虑您的 Numpy 数组名称是train_df

import numpy as np
np.savetxt('train_df.txt', train_df, fmt='%s')
Run Code Online (Sandbox Code Playgroud)

或者

from numpy import savetxt
savetxt('train_df.txt', train_df, fmt='%s')
Run Code Online (Sandbox Code Playgroud)


DrD*_*DEE 8

我相信您也可以非常简单地完成此操作,如下所示:

  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
Run Code Online (Sandbox Code Playgroud)

例如#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
Run Code Online (Sandbox Code Playgroud)

  • 无需重制,[原版](/sf/answers/2876786041/) 清晰明了。 (3认同)

Dak*_*ksh 7

如前所述,将数组转储为CSV文件的最佳方法是使用.savetxt(...)方法。但是,有些事情我们应该知道如何正确完成。

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

   narr = np.array([[1,2],
                 [3,4],
                 [5,6]], dtype=np.int32)
Run Code Online (Sandbox Code Playgroud)

并想另存savetxt

np.savetxt('values.csv', narr, delimiter=",")
Run Code Online (Sandbox Code Playgroud)

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

1.000000000000000000e+00,2.000000000000000000e+00
3.000000000000000000e+00,4.000000000000000000e+00
5.000000000000000000e+00,6.000000000000000000e+00
Run Code Online (Sandbox Code Playgroud)

你必须使用一个名为参数更改格式fmt

np.savetxt('values.csv', narr, fmt="%d", delimiter=",")
Run Code Online (Sandbox Code Playgroud)

以原始格式存储数据

以压缩的gz格式保存数据

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

我们只需要更改文件的扩展名,因为.gznumpy会自动处理所有内容

np.savetxt('values.gz', narr, fmt="%d", delimiter=",")
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你

  • `fmt="%d"` 正是我正在寻找的。谢谢你! (3认同)

小智 5

如果你想写在列中:

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

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

如果你想写成一行:

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