Если ваши действительные и мнимые части представляют собой срезы по последнему измерению, а ваш массив является смежным по последнему измерению, вы можете просто сделать
A.view(dtype=np.complex128)
Если вы используете поплавки одинарной точности, это будет
A.view(dtype=np.complex64)
Вот более полный пример
import numpy as np
from numpy.random import rand
# Randomly choose real and imaginary parts.
# Treat last axis as the real and imaginary parts.
A = rand(100, 2)
# Cast the array as a complex array
# Note that this will now be a 100x1 array
A_comp = A.view(dtype=np.complex128)
# To get the original array A back from the complex version
A = A.view(dtype=np.float64)
Если вы хотите избавиться от дополнительного измерения, которое остается вне каста, вы можете сделать что-то вроде
A_comp = A.view(dtype=np.complex128)[...,0]
Это работает, потому что в памяти комплексное число на самом деле представляет собой просто два числа с плавающей запятой.Первое представляет реальную часть, а второе представляет мнимую часть.Метод представления массива изменяет тип d массива, чтобы отразить, что вы хотите обрабатывать два смежных значения с плавающей запятой как одно комплексное число, и соответствующим образом обновляет измерение.
Этот метод не копирует никаких значений вмассив или выполнять любые новые вычисления, все, что он делает, это создает новый объект массива, который по-разному просматривает один и тот же блок памяти.Это позволяет выполнять эту операцию на намного быстрее, чем все, что связано с копированием значений.Это также означает, что любые изменения, внесенные в массив с комплексным значением, будут отражены в массиве с действительными и мнимыми частями.
Также может быть немного сложнее восстановить исходный массив, если удалить дополнительную осьто есть сразу после приведения типа.Такие вещи, как A_comp[...,np.newaxis].view(np.float64)
, в настоящее время не работают, потому что, на момент написания этой статьи, NumPy не обнаруживает, что массив все еще является C-смежным, когда добавляется новая ось.См. этот выпуск .A_comp.view(np.float64).reshape(A.shape)
, кажется, работает в большинстве случаев.