2013-10-31 70 views
2

我想保存一個數組組成的浮動和一列字符串,我得到一些非常奇怪的結果。這是我曾嘗試:Python:使用浮點數和字符串保存數據與np.savetxt

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

第一列(f1)是長的浮動(最多10位,但我只需要2個)。第二和第三列我也需要2-3位數字,分別爲f2f3。最後一列s1僅由兩個不同的字符串組成:'FeI''FeII'

的問題是,當我嘗試打印data我得到的是這樣的:

[['7352' '11.7' '-4.9' 'FeI'] 
..., 
['5340' '22.8' '-8.2' 'FeII']] 

雖然我想獲得這樣的事情(如果它保存花車爲字符串我不在乎,我可以輕鬆地將它們作爲事後浮動):

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

正如你所看到的,主要的問題是,它53407.66變成5340 - 一個幅度過!

可能的解決方法 要使用np.array代替,並使用dtype - 選項。但是,我不知道如何將字段存儲爲字符串。任何幫助?

+0

何時以及如何打印數據?它何時處於您指定的格式? –

回答

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') 

這裏是如何創建一個結構數組。第一個參數是元組列表。每個元組都包含數組中每個結構化元素的值。參數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')]) 

要控制字段的格式時,這是保存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數據幀,並使用其to_csv方法。

0

爲什麼不預先處理您正在存儲的數據? 像

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] 

如果您在以後使用這些計劃,你應該僅代表花車爲字符串,當你打印出來 - 而不是當你將它們存儲您的陣列英寸

1

使用zip的解決方案應該適用於大多數情況,但我認爲它可能不是最有效的解決方案。另外,當其中一個數組的類型爲np.dateTime64時,我遇到了一個小問題。這是使用熊貓的另一個解決方案...:

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') 
相關問題