我正在构建一个深度学习算法的数据库。我感兴趣的是这些:
with open(fname, 'a+') as f:
f.write("intens: " + str(mean_intensity_this_object) + "," + "\n")
f.write("distances: " + str(dists_this_object) + "," + "\n")
mean_intensity_this_object
是一个列表而dists_this_object
是numpy.array
,我开始时没有给予足够的重视。打开文件后,我发现第二个变量distances
看起来与intens
非常不同:前者是
distances: [430.17802963 315.2197058 380.33997833 387.46190951 41.93648858
221.5210474 488.99452579],
和后者
intens: [0.15381262,..., 0.13638344],
重要的一点是,后者是标准列表,而前者很难阅读:多行没有分隔符,并且启动新行的规则不明确。基本上,我必须重新运行整个跟踪算法,并将str(dists_this_object)
更改为str(dists_this_object.tolist())
,这会增加文件大小。
所以,我的问题是:为什么会发生这种情况?是否可以以更易读的格式保存np.array
个对象,例如列表?
答案 0 :(得分:0)
在交互式Python会话中:
>>> import numpy as np
>>> x = np.arange(10)/.33 # make an array of floats
>>> x
array([ 0. , 3.03030303, 6.06060606, 9.09090909,
12.12121212, 15.15151515, 18.18181818, 21.21212121,
24.24242424, 27.27272727])
>>> print(x)
[ 0. 3.03030303 6.06060606 9.09090909 12.12121212
15.15151515 18.18181818 21.21212121 24.24242424 27.27272727]
>>> print(x.tolist())
[0.0, 3.0303030303030303, 6.0606060606060606, 9.09090909090909, 12.121212121212121, 15.15151515151515, 18.18181818181818, 21.21212121212121, 24.242424242424242, 27.27272727272727]
列表的标准显示为[]
和,
。数组的显示没有,
。如果有超过1000个项目,则阵列显示使用省略号
>>> print(x)
[ 0. 3.03030303 6.06060606 ..., 3024.24242424
3027.27272727 3030.3030303 ]
,同时列表显示继续显示每个值。
在这一行中,你添加了...
,还是那部分版画?
intens: [0.15381262,..., 0.13638344],
或者对文件写做同样的事情:
In [299]: with open('test.txt', 'w') as f:
...: f.write('array:'+str(x)+'\n')
...: f.write('list:'+str(x.tolist())+'\n')
In [300]: cat test.txt
array:[ 0. 3.33333333 6.66666667 10. 13.33333333
16.66666667 20. 23.33333333 26.66666667 30. ]
list:[0.0, 3.3333333333333335, 6.666666666666667, 10.0, 13.333333333333334, 16.666666666666668, 20.0, 23.333333333333336, 26.666666666666668, 30.0]
np.savetxt
可以更好地控制数组的格式,例如:
In [312]: np.savetxt('test.txt',[x], fmt='%10.6f',delimiter=',')
In [313]: cat test.txt
0.000000, 3.333333, 6.666667, 10.000000, 13.333333, 16.666667, 20.000000, 23.333333, 26.666667, 30.000000
默认数组打印主要针对交互式工作,您希望在其中查看足够的值以查看它们是否正确,但您并不打算重新加载它们。 savetxt/loadtxt
对更好。
savetxt
大致如此:
for row in x:
f.write(fmt%tuple(row))
其中fmt
是根据您的输入参数和row
中的项目数量构建的,例如', '.join(['%10.6f']*10)+'\n'
In [320]: print('[%s]'%', '.join(['%10.6f']*10)%tuple(x))
[ 0.000000, 3.333333, 6.666667, 10.000000, 13.333333, 16.666667, 20.000000, 23.333333, 26.666667, 30.000000]
答案 1 :(得分:0)
实际上,python以相同的方式转换它们:str(object)
如果前者不存在则调用object.__str__()
或object.__repr__()
。从那时起,object
负责提供其字符串表示。
Python列表和numpy数组是不同的对象,由不同的人设计和实现以满足不同的需求,因此可以预期他们的__str__
和__repr__
方法的行为不同。