Python:使用带有np.savetxt的浮点数和字符串保存数据

Dan*_*sen 2 python types numpy

我试图保存一个由浮点数和一列字符串组成的数组,我得到一些非常奇怪的结果.这是我尝试过的:

data = np.column_stack((f1, f2, f3, s1))
Run Code Online (Sandbox Code Playgroud)

第一列(f1)是长浮点数(最多10位数,但我只需要2位数).我还需要在第二和第三列2-3位,f2f3分别.最后一列s1只包含两个不同的字符串:'FeI''FeII'.

问题是,当我尝试打印时,data我得到这样的东西:

[['7352'  '11.7'  '-4.9'  'FeI']
 ...,
 ['5340'  '22.8'  '-8.2'  'FeII']]
Run Code Online (Sandbox Code Playgroud)

虽然我想得到这样的东西(我不在乎它是否将浮点数保存为字符串,因为我之后可以轻松地将它们作为浮点数加载):

[['7352.91'  '11.78'  '-4.92'  'FeI']
 ...,
 ['53407.66'  '22.82'  '-8.27'  'FeII']]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,主要的问题是它53407.66变成了5340 - 一个大小!

可能的解决方案 使用np.array替代方法并使用dtype-option.但是,我不知道如何将列存储为字符串.有帮助吗?

War*_*ser 5

使用结构化数组来保存数据,而不是使用column_stack.

假设这是您的数据:

In [30]: f1
Out[30]: array([ 12.3,  45.6,  78.9])

In [31]: f2
Out[31]: array([ 10.11,  12.13,  14.15])

In [32]: f3
Out[32]: array([ 1. ,  2.5,  5. ])

In [33]: s1
Out[33]: 
array(['foo', 'bar', 'baz'], 
      dtype='|S3')
Run Code Online (Sandbox Code Playgroud)

以下是创建结构化数组的方法.第一个参数是元组列表.每个元组保存数组的每个结构化元素的值.该dtype参数定义在该结构中的字段的数据类型.在这种情况下,有三个浮点字段(名为'f1','f2'和'f3'),以及一个包含最多16个字符的字符串的字段(名为's1'):

In [34]: data = np.array(zip(f1, f2, f3, s1), dtype=[('f1', float), ('f2', float), ('f3', float), ('s1', 'S16')])

In [35]: data
Out[35]: 
array([(12.3, 10.11, 1.0, 'foo'), (45.6, 12.13, 2.5, 'bar'),
       (78.9, 14.15, 5.0, 'baz')], 
      dtype=[('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('s1', 'S16')])
Run Code Online (Sandbox Code Playgroud)

要在保存字段时控制字段的格式np.savetxt,您可以为其提供一个格式列表,每个字段对应一个格式:

In [36]: np.savetxt('output.txt', data, fmt=["%.3f",]*3 + ["%s"])

In [37]: !cat output.txt
12.300 10.110 1.000 foo
45.600 12.130 2.500 bar
78.900 14.150 5.000 baz
Run Code Online (Sandbox Code Playgroud)

注意:要考虑的另一个选择是将数据放入pandas DataFrame,并使用其to_csv方法.