2013-05-18 31 views
43

我有一组包含字符串和浮点数列表,如:如何使用python numpy.savetxt将字符串和浮点数写入ASCII文件?

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

回答

72

你必须指定数据的格式(fmt)在savetxt,在这种情况下,作为一个字符串(%s):

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

的默认格式是一个浮动,那就是它期待的理由一个float而不是一个字符串并解释错误信息。

+0

如果我想格式化数字,会发生什么?我怎样才能只给一些格式的数字? – skytux

+4

你可以给不同的列设置不同的格式,比如'fmt =“%f%i”'。但是如果你想像上面的例子那样把它和字符串结合起来,你需要一个结构化数组(参见[here](http://numpy-discussion.10968.n7.nabble.com/using-numpy-savetxt-to -save柱- - 数字值和柱-的文本值-td12304.html的#无))。在这个例子中,int被转换为一个字符串,然后不再可能以int格式化。 – joris

21

当前接受的答案实际上并未解决问题,该问题询问如何保存包含字符串和浮点数字的列表。为了完整起见,我提供了一个完整的工作示例,它基于@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,创建abstructured array的时候,而不是'S6'字节串正常工作在Python 3。后者dtype可以在Python 2.7中工作,但会在Python 3中编写像b'NAME_1'这样的字符串。

+2

如果我有一个二维浮点数组并希望用它的对应数组打印每个名字,该怎么办?唯一的方法是手动添加所有行,还是有更简单的方法来做到这一点? 预期产出:NAME_1 0.1 0.2 0.3 – plethora

相关问题