Экспорт numpy-матрицы комплексных чисел в CSV

У меня возникла следующая проблема с 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.

Что ты предлагаешь?

В документации перечислены возможные сложные форматы. Этот fmt=['%.18e+%.18ej']*5 работает с массивом из 5 столбцов. Другими словами, когда вы указываете и реальную, и воображаемую части, вы указываете формат для всех столбцов. Это не сделает за вас репликацию. Если это не поможет, вам может потребоваться прочитать код savetxt, обращая внимание на то, как он обрабатывает сложные массивы.

hpaulj 23.05.2018 06:40

Эффективный формат одной строки: ','.join(['%.18e+%.18ej']*5)%tuple(x[0].view(float)). То есть форматирует кортеж комплексных значений, разделенных на 2 числа с плавающей запятой. Так или иначе, для каждого значения A.shape[1]*2 должна быть строка формата.

hpaulj 23.05.2018 06:47

@hpaulj Я попробовал ваше предложение, и оно работает. Проблема, с которой я столкнулся сейчас, заключается в том, что он печатает +- для чисел с отрицательной мнимой частью, например 1.000000000000000000e+00+-6.103515625000000000e+09j, которые не могут быть прочитаны Matlab. Есть ли обходной путь?

mgus 23.05.2018 08:48
genfromtxt также не может загрузить этот формат. Возможно, нам нужно взглянуть на параметры форматирования Python %. На самом деле все, что делает savetxt, - это итерация по строкам и форматирование каждой как текстовой строки. Так что все, что вы можете сделать, чтобы получить красивую строку print, также должно работать при записи в текстовый файл.
hpaulj 23.05.2018 09:11

Если целью является MATLAB, вы можете попробовать scipy.io.savemat, создав файл, совместимый с .mat, вместо текста.

hpaulj 23.05.2018 09:12

Нам просто нужно переместить + внутрь выражения %, например ['%.18e%+.18ej'], поэтому он отображает +/- с частью изображения. docs.python.org/3/library/…. См. Также документацию по savetxt в разделе notes/flags.

hpaulj 23.05.2018 09:20

@hpaulj Спасибо, вы спасли мне день. Руководство мне кажется весьма озадаченным. Но можете ли вы дать мне ссылку, по которой вы нашли возможные сложные форматы, которые вы описали в своем первом комментарии?

mgus 23.05.2018 21:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
727
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, это не самый эффективный способ преобразования данных в большую матрицу, и я уверен, что существует более эффективное решение, состоящее из одной строки кода, но вы можете попробовать выполнить приведенный ниже код и посмотреть, работает ли он. Здесь я буду использовать панды для сохранения данных в файл 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)

Другие вопросы по теме