Python:使用float和string保存数据np.savetx公司

2024-06-16 13:27:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

data = np.column_stack((f1, f2, f3, s1))

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

问题是,当我试图打印data时,会得到这样的结果:

^{pr2}$

虽然我希望得到这样的结果(我不在乎是否将浮动保存为字符串,因为我可以很容易地将它们作为浮动加载):

[['7352.91'  '11.78'  '-4.92'  'FeI']
 ...,
 ['53407.66'  '22.82'  '-8.27'  'FeII']]

正如你所看到的,主要问题是,53407.66变成了5340——一个量级的变化!在

可能的解决方案 改为使用np.array并使用dtype-选项。但是,我不知道如何将列存储为字符串。有什么帮助吗?在


Tags: 字符串datastacknpcolumn数字数组f2
3条回答

为什么不预处理存储的数据? 像

f1 = ['{0:0.2f}'.format(str(item) for item in f1]
f2 = ['{0:0.3f}'.format(str(item) for item in f2]
f3 = ['{0:0.3f}'.format(str(item) for item in f3]

如果您打算以后使用它们,那么您可能应该只在打印时将它们表示为字符串,而不是将它们存储在数组中。在

使用结构化数组来保存数据,而不是使用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')

下面是如何创建结构化数组。第一个参数是元组列表。每个元组保存数组中每个结构化元素的值。dtype参数定义结构中字段的数据类型。在本例中,有三个浮点字段(名为“f1”、“f2”和“f3”)和一个字段(名为“s1”),其中包含最多16个字符的字符串:

^{pr2}$

要在使用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

注意:要考虑的另一个选项是将数据放入pandas数据帧中,并使用其^{}方法。在

使用zip的解决方案在大多数情况下都可以工作,但我认为它可能不是最有效的解决方案。另外,当其中一个数组的类型为np.日期时间64. 这里有另一个使用熊猫的解决方案…:

import pandas as pd
import numpy as np

f1 = np.array([ 12.3,  45.6,  78.9])
f2 = np.array([ 10.11,  12.13,  14.15])
f3 = np.array([ 1. ,  2.5,  5. ])
s1 = np.array(['foo', 'bar', 'baz'])
d1 = np.array(['2015-04-30T02:58:22.000+0200', '2015-04-30T02:58:22.000+0200',
       '2015-04-30T02:58:22.000+0200'], dtype='datetime64[ms]')
df = pd.DataFrame({
            'f1':f1,
            'f2':f2,
            'f3':f3,
            'str1':s1,
            'date':d1
})
df.to_csv('out.csv')

相关问题 更多 >