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

81 人关注

我有一组既包含字符串又包含浮点数的列表,如:。

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 (if possible) to do this.

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

When I do this, I get the following error:

>>> 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
Victor
Victor
发布于 2013-05-18
3 个回答
joris
joris
发布于 2022-03-10
已采纳
0 人赞同

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

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

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

如果我想对数字进行格式化又会怎样?我怎样才能只给数字提供一些格式?
你可以给不同的列以不同的格式,如 fmt="%f %i" 。但如果你想像上面的例子那样把它与字符串结合起来,你将需要一个结构化的数组(见 here ).在这个例子中,int被转换为字符串,然后作为int的格式化就不可能了。
divenex
divenex
发布于 2022-03-10
0 人赞同

目前接受的答案实际上并没有解决这个问题,它问的是如何保存包含字符串和浮点数的列表。为了完整起见,我提供了一个完全可行的例子,它是基于@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'在Python 3中也能正常工作。Unicode字符串dtype在创建ab结构化阵列,而不是'S6'的字节字符串。后一种dtype在Python 2.7中可以工作,但在Python 3中会写出像b'NAME_1'这样的字符串。

如果我有一个二维浮动数组,想打印每个名字和它对应的数组,怎么办?唯一的方法是手动添加所有的行,还是有更简单的方法? 预期的输出。name_1 0.1 0.2 0.3
Zarhin
Zarhin
发布于 2022-03-10
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: