Python中的CSV打印错误(枚举numpy数组)

时间:2015-09-25 13:22:04

标签: python csv numpy enumerate file-writing

如果这个问题看似重复,我道歉。我试图写一个7x2数组到.csv文件。我想要打印的数组称为 x5

x5
Out[47]: 
array([[  0.5,   1. ],
       [  0.7,   3. ],
       [  1.1,   5. ],
       [  1.9,   6. ],
       [  2. ,   7. ],
       [  2.2,   9. ],
       [  3.1,  10. ]])

我使用的代码:

import time
import csv
import numpy
timestr = time.strftime("%Y%m%d-%H%M%S")
with open('mydir\\AreaIntCurve'+'_'+str(timestr)+'.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['Unique value', ' Occurrences'])
    for m, val in numpy.ndenumerate(x5):
        writer.writerow([m, val])

我得到的结果:

Unique value, Occurrences
"(0, 0)",0.5
"(0, 1)",1.0
"(1, 0)",0.69999999999999996
"(1, 1)",3.0 
"(2, 0)",1.1000000000000001
"(2, 1)",5.0
"(3, 0)",1.8999999999999999
"(3, 1)",6.0
"(4, 0)",2.0
"(4, 1)",7.0
"(5, 0)",2.2000000000000002
"(5, 1)",9.0
"(6, 0)",3.1000000000000001
"(6, 1)",10.0

我想要的结果:

Unique value, Occurrences
0.5, 1
0.7, 3
1.1, 5
1.9, 6
2.0, 7
2.2, 9
3.1, 10 

我认为问题出在ndenumerate(x5),它打印了我的值的坐标。我尝试了不同的方法,如numpy.savetxt,但它不会产生我想要的东西,也不会在文件名中打印当前日期。如何修改ndenumerate()调用以摆脱值坐标,同时将当前日期保留在文件名中?非常感谢!

3 个答案:

答案 0 :(得分:2)

以下是使用numpy.savetxt代替csv库的替代方案:

In [17]: x5
Out[17]: 
array([[  0.5,   1. ],
       [  0.7,   3. ],
       [  1.1,   5. ],
       [  1.9,   6. ],
       [  2. ,   7. ],
       [  2.2,   9. ],
       [  3.1,  10. ]])

In [18]: np.savetxt('foo.csv', x5, fmt=['%4.1f', '%4i'], header='Unique value, Occurrences', delimiter=',', comments='')

In [19]: !cat foo.csv
Unique value, Occurrences
 0.5,   1
 0.7,   3
 1.1,   5
 1.9,   6
 2.0,   7
 2.2,   9
 3.1,  10

答案 1 :(得分:1)

您是否尝试用

替换最后两行代码
<div id="demo" onclick="myFunction()" >This is _____</div>

function myFunction() {
var str = document.getElementById("demo").innerHTML; 
var res = str.replace("_____", "Green");
document.getElementById("demo").innerHTML = res;}

您的csv结果可能会让您感到惊讶,而不是1.9的1.8999999999999999;这是因为1.9无法在浮点算术中准确表示(参见http://jsfiddle.net/pm12xf3z/)。

如果您想将位数限制为3,可以将最后一行替换为for x in x5: writer.writerow(x)

但是这也会为整数值添加三个零。由于您可以使用is_integer()检查float是否为整数,因此可以使用

来避免这种情况
writer.writerow([["{0:.3f}".format(val) for val in x]])

答案 2 :(得分:1)

替换此行

for m, val in numpy.ndenumerate(x5):
    writer.writerow([m, val])

使用:

for val in x5:
    writer.writerow(val)

你不需要做ndenumerate