Как сохранить и загрузить массив комплексных чисел, используя numpy.savetxt? - PullRequest
16 голосов
/ 27 июня 2011

Я хочу использовать numpy.savetxt(), чтобы сохранить массив комплексных чисел в текстовый файл.Проблемы:

  • Если вы сохраняете сложный массив со строкой формата по умолчанию, мнимая часть отбрасывается.
  • Если вы используете fmt='%s', то numpy.loadtxt() не может загрузитьэто если вы не укажете dtype=complex, converters={0: lambda s: complex(s)}.Даже тогда, если в массиве есть NaN, загрузка все равно не удалась.

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

Ответы [ 2 ]

14 голосов
/ 29 июня 2011

Проще и сохраняет несколько временных массивов, просто переосмысливая массив как реальный массив.

Сохранение:

numpy.savetxt('outfile.txt', array.view(float))

Загрузка:

array = numpy.loadtxt('outfile.txt').view(complex)

Есливы предпочитаете, чтобы реальная и мнимая части были в одной строке файла, вы можете использовать

numpy.savetxt('outfile.txt', array.view(float).reshape(-1, 2))

или

array = numpy.loadtxt('outfile.txt').view(complex).reshape(-1)

соответственно.

(обратите внимание, что ниview() или reshape() копирует массив - он просто будет по-разному интерпретировать одни и те же данные другим способом.)

Добавление от вопроса, задаваемого вопросом:

Еслиесли вы хотите сохранить более одного сложного массива в одном файле, вы можете сделать это следующим образом:

numpy.savetxt('outfile.txt', numpy.column_stack([
    array1.view(float).reshape(-1, 2),
    array2.view(float).reshape(-1, 2),
]))

array1, array2 = numpy.loadtxt('outfile.txt', unpack=True).view(complex)

Изменение формы необходимо, поскольку numpy.view() не работает с пошаговыми массивами.

5 голосов
/ 28 июня 2011

Вот мое решение, если кто-нибудь ответит на этот вопрос из Google.

Сохранение:

numpy.savetxt('outfile.txt', numpy.column_stack([array.real, array.imag]))

Загрузка:

array_real, array_imag = numpy.loadtxt('outfile.txt', unpack=True)
array = array_real + 1j * array_imag

Я все еще поставлю галочку для лучшего решения!

...