y.real
и y.imag
просто дают вам представления в массиве y
, которые пропускают каждые 8 байтов. Обратите внимание, что OWNDATA: False
флаг? Вот что это значит: они просто видят чужие данные. Вот почему они не смежны. Это не ошибка, это оптимизация.
abs
и angle
должны создать целый новый массив. Что является смежным, но это также означает, что вы просто потратили линейное время и пространство вместо постоянных нескольких десятков байтов и наносекунд.
Конечно, если хочет построить целый новый массив, вы всегда можете сделать это явно:
>>> y.real.copy().flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
Или:
>>> np.ascontiguousarray(y.real).flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
copy
конечно всегда копирует; Я считаю, что ascontiguousarray
копирует, только если массив еще не является смежным. Это не гарантируется в документах , но я уверен, что он просто вызывает require
. (В любом случае, любой из них будет намного быстрее, чем cos(angle(y))
.)