关于python:将NumPy数组转储到csv文件中

Dump a NumPy array into a csv file

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


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

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


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

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

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


tofile是一种方便的功能:

1
2
3
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文件,然后写入相同的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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) + '
'
)
    np.savetxt(fp, ar, '%s', ',')

注意,这个例子不考虑带逗号的字符串。要考虑非数字数据的报价,请使用csv包:

1
2
3
4
5
6
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作为

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

希望使用savetxt作为

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

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

1
2
3
1.000000000000000000e+00,2.000000000000000000e+00
3.000000000000000000e+00,4.000000000000000000e+00
5.000000000000000000e+00,6.000000000000000000e+00

您必须使用名为fmt的参数作为

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

以原始格式存储数据

以压缩gz格式保存数据

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

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

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

希望有帮助


如果要在列中写入:

1
2
3
4
    for x in np.nditer(a.T, order='C'):
            file.write(str(x))
            file.write("
"
)

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

如果要在行中写入:

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


您也可以使用纯Python来完成,而不需要使用任何模块。

1
2
3
4
5
6
7
8
# 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)


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

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

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


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

  • 将numpy数组转换为pandas数据帧
  • 另存为csv
  • 例如1:

    1
    2
    3
    4
    5
    6
    7
        # 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:

    1
    2
    3
    4
        #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()模块。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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()

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