Python 中错误的 CSV 打印(枚举 numpy 数组)
Wrong CSV printing in Python (enumerating numpy array)
如果这个问题看起来重复,我深表歉意。我正在尝试将 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()
调用以删除值坐标,同时在文件名中保留当前日期?非常感谢!
您是否尝试过将最后两行代码替换为
for x in x5:
writer.writerow(x)
?
您可能会惊讶地看到 1.8999999999999999 而不是您的 csv 结果中的 1.9;这是因为 1.9 无法在浮点运算中准确表示(参见 this question)。
如果要限制位数为3,可以将最后一行替换为writer.writerow([["{0:.3f}".format(val) for val in x]])
但这也会给整数值加上三个零。由于您可以使用 is_integer() 检查浮点数是否为整数,因此您可以使用
来避免这种情况
writer.writerow([str(y) if y.is_integer() else "{0:.3f}".format(y) for y in x])
替换此行
for m, val in numpy.ndenumerate(x5):
writer.writerow([m, val])
与:
for val in x5:
writer.writerow(val)
你不需要做 ndenumerate
这是一个使用 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
如果这个问题看起来重复,我深表歉意。我正在尝试将 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()
调用以删除值坐标,同时在文件名中保留当前日期?非常感谢!
您是否尝试过将最后两行代码替换为
for x in x5:
writer.writerow(x)
?
您可能会惊讶地看到 1.8999999999999999 而不是您的 csv 结果中的 1.9;这是因为 1.9 无法在浮点运算中准确表示(参见 this question)。
如果要限制位数为3,可以将最后一行替换为writer.writerow([["{0:.3f}".format(val) for val in x]])
但这也会给整数值加上三个零。由于您可以使用 is_integer() 检查浮点数是否为整数,因此您可以使用
来避免这种情况writer.writerow([str(y) if y.is_integer() else "{0:.3f}".format(y) for y in x])
替换此行
for m, val in numpy.ndenumerate(x5):
writer.writerow([m, val])
与:
for val in x5:
writer.writerow(val)
你不需要做 ndenumerate
这是一个使用 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