【问题标题】:How to use python numpy.savetxt to write strings and float number to an ASCII file?如何使用 python numpy.savetxt 将字符串和浮点数写入 ASCII 文件?
【发布时间】:2013-05-13 08:21:38
【问题描述】:

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

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我想格式化数字会发生什么?我怎样才能只给数字一些格式?
    • 您可以为不同的列赋予不同的格式,例如fmt="%f %i"。但是,如果您想将它与上面示例中的字符串组合,您将需要一个结构化数组(请参阅here)。在此示例中,int 被转换为字符串,然后无法再格式化为 int。
    【解决方案2】:

    当前接受的答案实际上并没有解决这个问题,它询问如何保存包含字符串和浮点数的列表。为了完整起见,我提供了一个完整的工作示例,该示例基于@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")
    

    更新:此示例在 Python 3 中也可以正常工作,在创建 ab structured array 时使用 'U6' Unicode 字符串 dtype,而不是 'S6' 字节字符串.后一种 dtype 可以在 Python 2.7 中工作,但会在 Python 3 中编写像 b'NAME_1' 这样的字符串。

    【讨论】:

    • 如果我有一个二维浮点数组并想用对应的数组打印每个名称怎么办?唯一的方法是手动添加所有行还是有更简单的方法来做到这一点?预期输出:NAME_1 0.1 0.2 0.3
    【解决方案3】:
    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 将字符串和浮点数写入文件,尤其是对于按行写入的字符串。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2019-05-18
    • 2021-03-31
    • 2014-10-13
    • 1970-01-01
    • 2014-04-04
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多