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

问题描述 投票:0回答:4

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

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 之外,还有其他方法吗?

python list numpy output
4个回答
143
投票

您必须在

fmt
中指定数据的格式 (
savetxt
),在本例中为字符串 (
%s
):

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

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


40
投票

当前接受的答案实际上并没有解决问题,该问题询问如何保存包含字符串和浮点数的列表。为了完整起见,我提供了一个完整的工作示例,该示例基于 @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'
结构化数组时使用
ab
Unicode 字符串 dtype(而不是
'S6'
字节字符串)也可以在 Python 3 中正常运行。后一种数据类型可以在 Python 2.7 中工作,但在 Python 3 中会写出类似
b'NAME_1'
的字符串。


0
投票
import numpy as np

a = 'a,b,c'

b = [[1, 2, 3], [4, 5, 6]]

with open('test.csv', 'w') as f:
    f.writelines(a + '\n')
    np.savetxt(f, b, delimiter=',', fmt='%f')



The output file would look like this:
a,b,c
1.000000,2.000000,3.000000
4.000000,5.000000,6.000000

此示例是 numpy.savetxt 将字符串和浮点数写入文件,特别是对于按行写入的字符串。


0
投票

其实还有一个 header 参数:

np.savetxt(file, data, delimiter=',', header='TimeStamp,X,Z', fmt='%s,%.2f,%d')
    
© www.soinside.com 2019 - 2024. All rights reserved.