2017-07-28 21 views
0

我想写一个3列数据数组到一个文本文件。每行都有一个包含在另一个数组中的相关日期和时间作为字符串。写混合numpy阵列类型到文件

例如:

>>> data 
array([[0, 1, 9], 
     [1, 1, 2], 
     [2, 4, 2], 
     [7, 3, 2], 
     [2, 2, 7], 
     [1, 0, 5]]) 

>>> dates 
array([['2017-07-28T12:00:00'], 
     ['2017-07-28T12:01:00'], 
     ['2017-07-28T12:02:00'], 
     ['2017-07-28T12:03:00'], 
     ['2017-07-28T12:04:00'], 
     ['2017-07-28T12:05:00']], 
     dtype='<U19') 

我试图使用numpy.savetxt写的字符串和文件数据。基于上述数据,输出文件应该是这样的:

'2017-07-28T12:00:00', 0, 1, 9 
'2017-07-28T12:01:00', 1, 1, 2 
'2017-07-28T12:02:00', 2, 4, 2 
'2017-07-28T12:03:00', 7, 3, 2 
'2017-07-28T12:04:00', 2, 2, 7 
'2017-07-28T12:05:00', 1, 0, 5 

不幸的是,我无法弄清楚如何正确地加入字符串和数字数据与savetxt工作。我尝试连接数组,将它们加入到元组中,堆叠它们等,但解决方案整天提到了我。理想情况下,我想坚持使用numpy,而不是一个一个的循环逐行打破或涉及Pandas。

任何人都可以推荐一种方法来使这项工作?

+0

如果你不这样做像'%s'回答一样,考虑列表方法。迭代'行'并格式化,并一次写入一行。 – hpaulj

回答

2

由于您想堆叠列(如将两个阵列粘在一起),因此需要使用np.column_stack()。但是,生成的数组具有不同的数据类型,因此在调用np.savetxt()时会导致一些问题。所以,作为一名quick'n'dirty解决方案,我提供的fmt=%s参数使用string formatter

import numpy as np 

a = np.array([ 
     [0, 1, 9], 
     [1, 1, 2], 
     [2, 4, 2], 
     [7, 3, 2], 
     [2, 2, 7], 
     [1, 0, 5] 
    ]) 

b = np.array([ 
     ['2017-07-28T12:00:00'], 
     ['2017-07-28T12:01:00'], 
     ['2017-07-28T12:02:00'], 
     ['2017-07-28T12:03:00'], 
     ['2017-07-28T12:04:00'], 
     ['2017-07-28T12:05:00'] 
    ]) 

out = np.column_stack([b, a]) 

np.savetxt('output.txt', out, delimiter='\t', fmt="%s") 

输出看起来是这样的(由于标签分离delimiter='\t'):

2017-07-28T12:00:00 0 1 9 
2017-07-28T12:01:00 1 1 2 
2017-07-28T12:02:00 2 4 2 
2017-07-28T12:03:00 7 3 2 
2017-07-28T12:04:00 2 2 7 
2017-07-28T12:05:00 1 0 5 
+1

我期望'out'是一个字符串类型(即将数字转换为它们的字符串等价物)。在这种情况下'%s'是唯一的'fmt'选项。没关系,只要你不需要控制像小数点这样的东西。使用复合dtype构造一个结构化数组是更多的工作,并且还需要一个fancier'fmt'。 – hpaulj

+0

hpaulj是正确的,最终结束为一个字符串类型。我上面的例子稍微简化了,我确实需要控制小数点,所以不幸的是,albert的快速和肮脏的解决方案将无法正常工作。如何创建一个包含可写入文件的二维数组的复合数据类型? – jgrant