ChatGPT解决这个技术问题 Extra ChatGPT

将 NumPy 数组转储到 csv 文件中

如何以人类可读的格式将 NumPy 数组转储到 csv 文件中?


c
cs95

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'
m
maxbellec

您可以使用 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 关键字参数设置为 ''# 将被禁止。
Y
YakovL

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()
M
Mike T

将记录数组写入带有标题的 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']) 等
D
Deepak Kr Gupta

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

例如,如果您有一个带有 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 的参数来更改格式

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

以原始格式存储数据

以压缩的 gz 格式保存数据

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

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

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

希望能帮助到你


fmt="%d" 是我正在寻找的。谢谢!
D
DrDEE

我相信你也可以很简单地做到这一点,如下所示:

将 Numpy 数组转换为 Pandas 数据框另存为 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

无需重拍,the original 清晰明了。
E
Ege Kaan Gürkan

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

考虑您的 Numpy 数组名称是 train_df:

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

或者

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

由于您正在调用 np.savetext(...,因此不需要导入调用 from numpy import savetxt。如果您确实导入它,您可以简单地将其称为 savetext(...
R
Rimjhim .

如果你想在列中写:

    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)

T
Tamil Selvan S

在 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()

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


这已被建议:stackoverflow.com/a/41009026/8881141请只添加新方法,不要重复以前发布的建议。
M
Mr Poin

如果你想将你的 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 数组所节省的所有内存
H
Hemen Ashodia

您也可以在不使用任何模块的情况下使用纯 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 这取决于您的数据,但是如果它很大,它可以使用大量内存
G
Giorgos Myrianthous

numpy.savetxt() 方法用于将 NumPy 数组保存到输出文本文件中,但默认情况下它将使用科学计数法。

如果您想避免这种情况,则需要使用 fmt 参数指定适当的格式。例如,

import numpy as np

np.savetxt('output.csv', arr, delimiter=',', fmt='%f')