python中的字符串(数组)与字符串(列表)

时间:2016-09-05 16:24:05

标签: python arrays string list numpy

我正在构建一个深度学习算法的数据库。我感兴趣的是这些:

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_objectnumpy.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个对象,例如列表?

2 个答案:

答案 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__方法的行为不同。