【问题标题】:Numpy savetxt to csv with integer integer stringNumpy savetxt 到 csv 与整数整数字符串
【发布时间】:2014-07-29 04:25:40
【问题描述】:

我想使用 numpy 中的 savetxt 函数将三个列表保存在 csv 文件中。

list1、list2 和 list3 都具有相同的长度且具有单个值。

list1,list2 是整数值,list3 是字符串值

所以最后它应该看起来像这样 column1=list1 column2=list2 column3=list3

如果 list3 也是整数,这也适用于我。它现在不起作用,因为 list3 是一个字符串。

如何使用 list3 作为字符串来实现这一点并找到c_ 的解决方法?

savetxt('data/result.csv', c_(list1,list2,list3), delimiter=',', fmt='%d, %d, %d', 
            header='Name,Value,Value2', comments = '')

非常感谢您的帮助!

【问题讨论】:

标签: python csv numpy


【解决方案1】:

一个问题是这样的:

c_(list1, list2, list3)

c_ 是一个古怪的对象,索引它而不是调用它。当你调用它时,你会得到 cmets 中提到的错误:

In [42]: c_(list1, list2, list3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-42-8fcbef857684> in <module>()
----> 1 c_(list1, list2, list3)

TypeError: 'CClass' object is not callable

改为使用方括号,这样您就可以进行索引:

In [44]: c_[list1, list2, list3]
Out[44]: 
array([['10', '15', 'foo'],
       ['20', '25', 'bar'],
       ['30', '35', 'baz']], 
      dtype='|S3')

请注意,它会创建一个 dtype 为 '|S3' 的数组。也就是说,数组中的所有元素都已转换为字符串。要使用savetxt 保存它,请使用fmt='%s, %s, %s'

In [45]: savetxt('result.csv', c_[list1, list2, list3], fmt='%s, %s, %s')

In [46]: !cat result.csv
10, 15, foo
20, 25, bar
30, 35, baz

此外,您可以使用zip(list1, list2, list3) 代替c_[list1, list2, list3]。然后savetxt 函数将处理将该参数转换为数组。

In [57]: list1 = [100000, 200000, 300000]

In [58]: savetxt('result.csv', zip(list1, list2, list3), fmt='%s, %s, %s')

In [59]: !cat result.csv
100000, 15, foo
200000, 25, bar
300000, 35, baz

显然c_ 不能很好地确定字符串的适当长度:

In [60]: c_[list1, list2, list3]
Out[60]: 
array([['100', '15', 'foo'],
       ['200', '25', 'bar'],
       ['300', '35', 'baz']], 
      dtype='|S3')

顺便说一句,你的数据还没有在一个 numpy 数组中,所以我认为使用savetxt 代替标准库csv 不会有太多好处。例如,

In [61]: import csv

In [62]: with open('result.csv', 'w') as f:
   ....:     wrtr = csv.writer(f)
   ....:     wrtr.writerows(zip(list1, list2, list3))
   ....:     

In [63]: !cat result.csv
100000,15,foo
200000,25,bar
300000,35,baz

【讨论】:

  • 我们越来越近了,我已经尝试过了,谢谢。但是我所有的整数 10000 都转换为 1。
  • 我所有的整数现在都是 1-9。这开始于使用c_[] transformed_matrix =c_[list1,list2,list3] print(transformed_matrix[1] => ['1' '2' 'b']
  • 我更新了我的答案,建议使用zip(list1, list2, list3) 而不是c_[list1, list2, list3]
  • 只有一个问题,我用整数手动完成了一个 csv 文件,并用字符串手动替换了最后一列。现在将其与 %s %s %s 进行比较。这个文件怎么变大了?
  • 使用fmt 参数来控制间距,例如%s,%s,%s%s, %s, %s
猜你喜欢
  • 1970-01-01
  • 2016-08-09
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2019-09-19
  • 2017-10-29
  • 1970-01-01
相关资源
最近更新 更多