如何使用python numpy.savetxt将字符串和浮点数写入ASCII文件?


70

我有一组包含字符串和浮点数的列表,例如:

import numpy as num

NAMES  = num.array(['NAME_1', 'NAME_2', 'NAME_3'])
FLOATS = num.array([ 0.5    , 0.2     , 0.3     ])

DAT =  num.column_stack((NAMES, FLOATS))

我想将这两个列表堆叠在一起,然后将它们以列的形式写入文本文件;因此,我想使用numpy.savetxt(如果可能)来执行此操作。

num.savetxt('test.txt', DAT, delimiter=" ") 

当我这样做时,出现以下错误:

>>> num.savetxt('test.txt', DAT, delimiter=" ") 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/numpy-1.8.0.dev_9597b1f_20120920-py2.7-macosx-10.8-x86_64.egg/numpy/lib/npyio.py", line 1047, in savetxt
    fh.write(asbytes(format % tuple(row) + newline))
TypeError: float argument required, not numpy.string_

理想的输出文件如下所示:

NAME_1    0.5
NAME_2    0.2
NAME_3    0.3

如何将字符串和浮点数都写到文本文件中,可能避免使用csv(如果其他人可读,我想这样做)?还有另一种方法可以代替numpy.savetxt吗?

Answers:


118

您必须在中将fmt数据的格式()指定savetxt为字符串(%s):

num.savetxt('test.txt', DAT, delimiter=" ", fmt="%s") 

默认格式是浮点数,这就是它期望使用浮点数而不是字符串的原因,并说明了错误消息。


如果我要格式化数字会怎样?我怎样才能只给数字一些格式?
skytux

5
您可以为不同的列指定不同的格式,例如fmt="%f %i"。但是,如果您想像上面的示例那样将它与字符串组合,则将需要一个结构化的数组(请参阅此处)。在此示例中,将int转换为字符串,然后再无法将其格式化为int。
joris 2014年

36

当前接受的答案实际上并未解决问题,该问题询问如何保存包含字符串和浮点数的列表。为了完整起见,我提供了一个完整的工作示例,该示例基于@joris注释中给出的链接进行了一些修改。

import numpy as np

names  = np.array(['NAME_1', 'NAME_2', 'NAME_3'])
floats = np.array([ 0.1234 ,  0.5678 ,  0.9123 ])

ab = np.zeros(names.size, dtype=[('var1', 'U6'), ('var2', float)])
ab['var1'] = names
ab['var2'] = floats

np.savetxt('test.txt', ab, fmt="%10s %10.3f")

更新:在创建结构化数组时,使用'U6'Unicode字符串dtype代替字节字符串,此示例在Python 3中也可以正常工作。后面的dtype在Python 2.7中可以使用,但是可以像在Python 3中一样编写字符串。ab 'S6'b'NAME_1'


3
如果我有一个二维浮点数组,并想用其对应数组打印每个名称怎么办?唯一的方法是手动添加所有行,还是有一种更简单的方法来做到这一点?预期输出:NAME_1 0.1 0.2 0.3
plethora
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.