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位,f2并f3分别.最后一列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.但是,我不知道如何将列存储为字符串.有帮助吗?
使用结构化数组来保存数据,而不是使用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方法.