У меня возникла следующая проблема с Python. Предположим, что numpy.matrix A с объектами dtype является complex128. Я хочу экспортировать A в формате CSV, чтобы записи разделялись запятыми, а каждая строка в выходном файле соответствовала строке A. Мне также нужны 18 десятичных знаков точности как для реальной, так и для мнимой частей и без пробелов внутри запись например мне это нужно
`6.103515626000000000e+09+1.712134684679831166e+05j`
вместо
`6.103515626000000000e+09 + 1.712134684679831166e+05j`
Следующая команда работает, но только для матрицы 1 на 1
numpy.savetxt('A.out', A, fmt='%.18e%+.18ej', delimiter=',')
Если я использую:
numpy.savetxt('A.out', A, delimiter=',')
есть две проблемы. Во-первых, я не знаю, сколько десятичных знаков сохраняется по умолчанию. Во-вторых, каждая сложная запись заключена в круглые скобки, например
(6.103515626000000000e+09+1.712134684679831166e+05j)
и я не могу прочитать файл в Matlab.
Что ты предлагаешь?
Эффективный формат одной строки: ','.join(['%.18e+%.18ej']*5)%tuple(x[0].view(float)). То есть форматирует кортеж комплексных значений, разделенных на 2 числа с плавающей запятой. Так или иначе, для каждого значения A.shape[1]*2 должна быть строка формата.
@hpaulj Я попробовал ваше предложение, и оно работает. Проблема, с которой я столкнулся сейчас, заключается в том, что он печатает +- для чисел с отрицательной мнимой частью, например 1.000000000000000000e+00+-6.103515625000000000e+09j, которые не могут быть прочитаны Matlab. Есть ли обходной путь?
genfromtxt также не может загрузить этот формат. Возможно, нам нужно взглянуть на параметры форматирования Python %. На самом деле все, что делает savetxt, - это итерация по строкам и форматирование каждой как текстовой строки. Так что все, что вы можете сделать, чтобы получить красивую строку print, также должно работать при записи в текстовый файл.
Если целью является MATLAB, вы можете попробовать scipy.io.savemat, создав файл, совместимый с .mat, вместо текста.
Нам просто нужно переместить + внутрь выражения %, например ['%.18e%+.18ej'], поэтому он отображает +/- с частью изображения. docs.python.org/3/library/…. См. Также документацию по savetxt в разделе notes/flags.
@hpaulj Спасибо, вы спасли мне день. Руководство мне кажется весьма озадаченным. Но можете ли вы дать мне ссылку, по которой вы нашли возможные сложные форматы, которые вы описали в своем первом комментарии?






Вероятно, это не самый эффективный способ преобразования данных в большую матрицу, и я уверен, что существует более эффективное решение, состоящее из одной строки кода, но вы можете попробовать выполнить приведенный ниже код и посмотреть, работает ли он. Здесь я буду использовать панды для сохранения данных в файл csv. Первые столбцы в сгенерированном CSV-файле будут соответственно вашей реальной и мнимой частями. Здесь я также предполагаю, что размер входной матрицы равен Nx1.
import pandas as pd
import numpy as np
def to_csv(t, nr_of_decimal = 18):
t_new = np.matrix(np.zeros((t.shape[0], 2)))
t_new[:,:] = np.round(np.array(((str(np.array(t[:])[0][0])[1:-2]).split('+')), dtype=float), decimals=nr_of_decimal)
(pd.DataFrame(t_new)).to_csv('out.csv', index = False, header = False)
#Assume t is your complex matrix
t = np.matrix([[6.103515626000000000e+09+1.712134684679831166e+05j], [6.103515626000000000e+09+1.712134684679831166e+05j]])
to_csv(t)
В документации перечислены возможные сложные форматы. Этот
fmt=['%.18e+%.18ej']*5работает с массивом из 5 столбцов. Другими словами, когда вы указываете и реальную, и воображаемую части, вы указываете формат для всех столбцов. Это не сделает за вас репликацию. Если это не поможет, вам может потребоваться прочитать кодsavetxt, обращая внимание на то, как он обрабатывает сложные массивы.