python numpy数组动态写入csv文件_关于python:将NumPy数组转储到csv文件中

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

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

import numpy

a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])

numpy.savetxt("foo.csv", a, delimiter=",")

这是否优于按维度循环遍历数组?我想是的。

数组是一个ndarray。我希望能加起来。

您还可以使用fmt关键字更改每个图形的格式。默认值为"%.18e",这可能很难读取,您可以使用"%.3e",因此只显示3个小数。

安德里亚,是的,我用了10.5华氏度,很方便。

您的方法对数值数据很有效,但它会对字符串的numpy.array产生错误。您能为包含字符串的numpy.array对象指定一个保存为csv的方法吗?

当scipy文档说分隔符是字符或字符串分隔列时,它意味着什么?当我使用savetxt()时,它将所有内容都抛出在同一列中。另外,如何以.tsv格式保存?我们用4个空格吗?scipy文档根本不涉及.tsv,但是.tsv是一种常见的格式,必须有一种方法。有什么想法吗?

@É;beisaac您也可以将格式指定为字符串:fmt='%s'。

您甚至可以为每列设置不同的格式,例如fmt = '%.4f, %.8f'在第一列和第二列分别写入4和8个小数。

类型错误:数组DType("对象")和格式说明符("%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18‌&35;8203;E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,‌&8203,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E,%.18E E,%.18‌&8203;E')

这个答案应该让comments=''去掉列名称开头的奇怪哈希符号吗?

您可以使用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)

我一次又一次地发现,最好的csv输出是"piped"到pandas"to"到"u csv"

不好的。这将创建一个df,并免费使用额外的内存。

像魅力一样工作,这是非常快速的权衡额外的内存使用。参数header=None, index=None删除标题行和索引列。

也适用于带有字符串的列表。

numpy.savetxt方法很好,但它在头行的开头放了一个哈希符号。

@戴夫:你必须把comments关键字参数设置为'',#将被抑制。

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')

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

This is a convenience function for quick storage of array data.

Information on endianness and precision is lost, so this method is not

a good choice for files intended to archive data or transport data

between machines with different endianness. Some of these problems can

be overcome by outputting the data as text files, at the expense of

speed and file size.

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

据我所知,这不会生成csv文件,而是将所有内容放在一行上。

@彼得,说得好,谢谢,我已经更新了答案。对于我来说,它的确以csv格式保存了OK(尽管仅限于一行)。此外,很明显,询问者的意图是"以人类可读的格式转储它"——所以我认为答案是相关的和有用的。

自1.5.0版以来,np.tofile()采用可选参数newline=''以允许多行输出。docs.scipy.org/doc/numpy-1.13.0/reference/generated/…

实际上,np.savetext()提供了换行参数,而不是np.tofile()。

将记录数组作为带标题的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', '

# Write as a CSV file with headers on first line

with open('out.csv', 'w') as fp:

fp.write(','.join(ar.dtype.names) + '

')

np.savetxt(fp, ar, '%s', ',')

注意,这个例子不考虑带逗号的字符串。要考虑非数字数据的报价,请使用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())

如前所述,将数组转储到csv文件中的最佳方法是使用.savetxt(...)方法。然而,有一些事情我们应该知道,以适当地做它。

例如,如果您有一个numpy数组,其中dtype = np.int32作为

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=",")

希望有帮助

我要找的是江户十一号。谢谢您!

如果要在列中写入:

for x in np.nditer(a.T, order='C'):

file.write(str(x))

file.write("

")

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

如果要在行中写入:

writer= csv.writer(file, delimiter=',')

for x in np.nditer(a.T, order='C'):

row.append(str(x))

writer.writerow(row)

您也可以使用纯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 ="

".join(csv_rows)

# write it to a file

with open('file.csv', 'w') as f:

f.write(csv_text)

这需要大量的内存。更喜欢在每行上循环并格式化和写入。

@Remram取决于您的数据,但如果它很大,则会占用大量内存。

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

然后以正常方式保存到一个单元,使用delimiter=';'csv文件中的单元格看起来像这个[[1, 2], [2, 4]]

然后您可以这样恢复您的数组:埃多克斯1〔6〕

这真的会破坏使用numpy数组所节省的所有内存。

我相信你也可以简单地做到以下几点:

将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

在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请只添加新方法,不要重复以前发布的建议。

你可能感兴趣的:(python)