Преобразуйте массив numpy в строку CSV и строку CSV обратно в массив numpy

Мне нужно преобразовать массив numpy из числа float в строку (для хранения в SQL DB), а затем также преобразовать одну и ту же строку в массив с плавающей запятой numpy.

Вот как я иду в строку ( на основе этой статьи )

VIstring = ''.join(['%.5f,' % num for num in VI]) VIstring= VIstring[:-1] #Get rid of the last comma 

Итак, во-первых, это работает, это хороший способ пойти? Их лучший способ избавиться от этой последней запятой? Или я могу получить метод join для вставки запятых для меня?

Во-вторых, что еще более важно, есть ли умный способ получить от строки обратно массив с плавающей точкой?

Ниже приведен пример массива и строки:

 VI array([ 17.95024446, 17.51670904, 17.08894626, 16.66695611, 16.25073861, 15.84029374, 15.4356215 , 15.0367219 , 14.64359494, 14.25624062, 13.87465893, 13.49884988, 13.12881346, 12.76454968, 12.40605854, 12.00293814, 11.96379322, 11.96272486, 11.96142533, 11.96010489, 11.95881595, 12.26924591, 12.67548634, 13.08158864, 13.4877041 , 13.87701221, 14.40238245, 14.94943786, 15.49364166, 16.03681428, 16.5498035 , 16.78362298, 16.90331119, 17.02299387, 17.12193689, 17.09448654, 17.00066063, 16.9300633 , 16.97229868, 17.2169709 , 17.75368411]) VIstring '17.95024,17.51671,17.08895,16.66696,16.25074,15.84029,15.43562,15.03672,14.64359,14.25624,13.87466,13.49885,13.12881,12.76455,12.40606,12.00294,11.96379,11.96272,11.96143,11.96010,11.95882,12.26925,12.67549,13.08159,13.48770,13.87701,14.40238,14.94944,15.49364,16.03681,16.54980,16.78362,16.90331,17.02299,17.12194,17.09449,17.00066,16.93006,16.97230,17.21697,17.75368' 

О да, и потеря точности из %.5f полностью прекрасна, эти значения интерполируются исходными точками, но имеют только 4 десятичные точки, поэтому мне не нужно бить это. Поэтому, восстанавливая массив numpy, я рад получить только 5 десятичных знаков (очевидно, я полагаю)

3 Solutions collect form web for “Преобразуйте массив numpy в строку CSV и строку CSV обратно в массив numpy”

Сначала вы должны использовать этот способ, чтобы избежать последней запятой:

 VIstring = ','.join(['%.5f' % num for num in VI]) 

Затем, чтобы прочитать его, используйте numpy.fromstring :

 np.fromstring(VIstring, sep=',') 
 >>> import numpy as np >>> from cStringIO import StringIO >>> VI = np.array([ 17.95024446, 17.51670904, 17.08894626, 16.66695611, 16.25073861, 15.84029374, 15.4356215 , 15.0367219 , 14.64359494, 14.25624062, 13.87465893, 13.49884988, 13.12881346, 12.76454968, 12.40605854, 12.00293814, 11.96379322, 11.96272486, 11.96142533, 11.96010489, 11.95881595, 12.26924591, 12.67548634, 13.08158864, 13.4877041 , 13.87701221, 14.40238245, 14.94943786, 15.49364166, 16.03681428, 16.5498035 , 16.78362298, 16.90331119, 17.02299387, 17.12193689, 17.09448654, 17.00066063, 16.9300633 , 16.97229868, 17.2169709 , 17.75368411]) >>> s = StringIO() >>> np.savetxt(s, VI, fmt='%.5f', newline=",") >>> s.getvalue() '17.95024,17.51671,17.08895,16.66696,16.25074,15.84029,15.43562,15.03672,14.64359,14.25624,13.87466,13.49885,13.12881,12.76455,12.40606,12.00294,11.96379,11.96272,11.96143,11.96010,11.95882,12.26925,12.67549,13.08159,13.48770,13.87701,14.40238,14.94944,15.49364,16.03681,16.54980,16.78362,16.90331,17.02299,17.12194,17.09449,17.00066,16.93006,16.97230,17.21697,17.75368,' >>> np.fromstring(s.getvalue(), sep=',') array([ 17.95024, 17.51671, 17.08895, 16.66696, 16.25074, 15.84029, 15.43562, 15.03672, 14.64359, 14.25624, 13.87466, 13.49885, 13.12881, 12.76455, 12.40606, 12.00294, 11.96379, 11.96272, 11.96143, 11.9601 , 11.95882, 12.26925, 12.67549, 13.08159, 13.4877 , 13.87701, 14.40238, 14.94944, 15.49364, 16.03681, 16.5498 , 16.78362, 16.90331, 17.02299, 17.12194, 17.09449, 17.00066, 16.93006, 16.9723 , 17.21697, 17.75368]) 

Если вам требуется какое-то строковое представление (не обязательно CSV), вы можете попробовать это, которое я использовал:

 import numpy, json ## arr is some numpy.ndarray s = json.dumps(arr.tolist()) arrback = numpy.array(json.loads(s)) 

Он работает для большинства распространенных типов данных.

  • Python os.walk Сделать его поддержкой Unicode / UTF-8?
  • Как создать копию итератора python?
  • Разделите словарь на переменные
  • Создание фрейма данных pandas из словаря
  • Tornado POST 405: метод не разрешен
  • Python перебирает список и объединяет строки без специального символа в предыдущем элементе
  • Почему существует другое поведение от getpwuid и getgrgid?
  • Как построить прямоугольник на оси datetime с использованием matplotlib?
  • Python - лучший язык программирования в мире.