2016-09-05 4 views
-1

Я строил базу данных для алгоритма глубокого обучения. Точки меня интересуют следующие:string (array) vs string (list) in python

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

Вы прочитали мой вопрос? Я решил проблему с помощью array.tolist(). Я спросил что-то совсем другое. – Alex

+0

Вы можете написать массив в текстовый файл, например список, просто переведя его в список. Но вы уже это сделали, поэтому я не понимаю, о чем вы спрашиваете. – Goyo

+0

почему downvote? Это законный вопрос, и я показал свою работу. – Alex

ответ

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] 
0

На самом деле питон преобразует и таким же образом: str(object) вызовы object.__str__() или object.__repr__() если прежний не существует. С этого момента ответственность составляет object за его строковое представление.

Списки Python и массивы numpy представляют собой разные объекты, спроектированные и реализованные разными людьми для удовлетворения различных потребностей, поэтому следует ожидать, что их методы __str__ и __repr__ не ведут себя одинаково.