Подтвердить что ты не робот

Как сохранить и загрузить массив комплексных чисел с помощью numpy.savetxt?

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

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

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

4b9b3361

Ответ 1

Это проще и экономит несколько временных массивов, чтобы просто переинтерпретировать массив как реальный массив.

Сохранение:

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() не работает с массивами strided.

Ответ 2

Здесь мое решение, в случае, если кто-то ударит по этому вопросу из 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

Я по-прежнему буду отмечать галочку лучшим решением!