принятие действительной или мнимой части делает массив не C-contigous в numpy - PullRequest
0 голосов
/ 03 мая 2018

У меня есть numpy-массив, и мне нужно, чтобы он был C-F-смежным (для paraview):

t=np.linspace(0,10) y=exp(1j*t) Пока это смежные, которые я проверяю по y.flags. Но когда я беру реальную или мнимую часть этого массива - он становится несмежным, например, y.real.flags показывает это. С другой стороны, если я возьму abs(y) или angle(y) - они оба смежны, так что я могу реально найти реальную и мнимую часть, выполнив cos или sin из angle(y). Почему взятие real или imag делает массив несмежным? Ошибка?

1 Ответ

0 голосов
/ 03 мая 2018

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)).)

...