2014-12-15 1 views
3

У меня есть некоторые данные, хранящиеся в структурированном массиве numpy, который я хотел бы записать в файл. Поскольку я генерирую некоторый код для соответствия существующему формату вывода, который экспортировал более визуально приятную таблицу, мне нужно выводить эти данные с помощью разного разделителя пробелов.Запись строки из структурированной массива numpy с разным разделителем

Используя простой пример:

import numpy as np 

x = np.zeros((2,),dtype=('i4,f4,a10')) 
x[:] = [(1,2.,'Hello'),(2,3.,'World')] 

С желаемым выходом:

1 2.00 Hello 
2 3.00 World 

Теперь я знаю, что я мог бы сделать это:

for row in x: 
    print('%i %.2f %s' % (row[0], row[1], row[2])) 

Который работает нормально, но это представляется слишком многословным, если у вас много столбцов. Сейчас на моем выходе 8.

Я новичок в Python (от MATLAB), есть ли более общее утверждение, которое я мог бы использовать для «свертывания» всех столбцов? Я думал что-то вроде строк print('%i %.2f %s' % val for val in row), но это просто печатает 2 генератора. Когда я столкнулся с генератором при использовании re.split, я мог бы использовать list(), чтобы получить желаемый результат, но я не думаю, что использование чего-то похожего, скажем, str() для этого случая будет делать то, что я ищу.

+0

Можете ли вы рассказать о том, как выглядит '' разный разделитель пробелов '?Какими правилами следует количество пробелов? – cel

+0

@cel Нет правила, однако я указываю его в строке формата – excaza

+0

Если количество пробелов полностью произвольно и не соответствует какому-либо шаблону, вы, вероятно, не сможете добиться большего, чем указать строку формата вручную. Если вы переключитесь на 'string.format', вы можете по крайней мере объединить форматирование с распаковкой кортежа:' '{} {: .2f} {} '. Format (* rows)'. – cel

ответ

1

Если вы обертываете row в tuple, вам не нужно перечислять все элементы. % форматов принимает tuple. row может отображаться как tuple, но на самом деле это numpy.void.

for row in x: 
    print('%i %.2f %s'%tuple(row)) 

Печать или запись строк в петле, как это совершенно нормально, Python.

Класс __str__ методы часто написаны как:

astr=['a header line'] 
for row in x: 
    astr.append('%i %.2f %s'%tuple(row)) 
astr='\n'.join(astr) 

производит строку соединенных линий.

постижение эквивалент может быть:

'\n'.join('%i %.2f %s'%tuple(row) for row in x) 

Поскольку вы используете Python3, вы также можете использовать .format подход, но я подозреваю, что % стиль ближе к тому, что вы используете в среде MATLAB.

+0

Спасибо, это именно то, что я ищу! Оцените информацию о предыстории тоже :) – excaza

1

Первый: Что касается вашего неявного вопроса с генераторами; вы можете «stringify» генератор, например с str.join:

>>> gen = (i.upper() for i in "teststring") 
>>> print(''.join(gen)) 
TESTSTRING 

Второе: Для фактического вопроса: Это немного более общий характер, чем ваш подход, но он по-прежнему не очень удовлетворительным.

formats = [ 
    ("{}", 1),  # format and number of spaces for row[0] 
    ("{.2f}", 4), # the same for row[1] 
    ("{}", 0)  # and row[2] 
] 
for row in x: 
    lst = [f.format(d) + (" "*s) for (f, s, d) in zip(formats, row)] 
    print(*lst, sep='') 

Это просто лучший обзор для каждого формата.

+0

Спасибо за информацию! Это работает, но другой ответ - это то, что я искал. – excaza

Смежные вопросы