取实部或虚部使数组在numpy中不连续

taking real or imaginary part makes array not C-contigous in numpy

我有一个 numpy 数组,我需要它是 F 连续的 C-(对于 paraview):

t=np.linspace(0,10) y=exp(1j*t) 到目前为止它是连续的,我通过 y.flags 检查。 但是当我取这个数组的实部或虚部时 - 它变得不连续,例如 y.real.flags 表明。另一方面,如果我取 abs(y)angle(y) - 它们都是连续的,那么我实际上可以通过执行 cossin of [=15] 来找到实部和虚部=].为什么使用 realimag 会使数组不连续?错误?

y.realy.imag 只是让您查看每隔 8 个字节跳过的 y 数组。注意到 OWNDATA: False 标志了吗?这就是它的意思:它们只是对其他人数据的一种看法。这也是为什么它们不连续的原因。这不是错误,这是优化。

absangle 必须构建一个全新的数组。这是连续的,但这也意味着您只花费了线性时间 space 而不是恒定的几十个字节和纳秒。

当然,如果想要构建一个全新的数组,您总是可以明确地这样做:

>>> 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 只有在数组不连续的情况下才会复制。这似乎并不能保证 in the docs, but I'm pretty sure it just calls require。 (反正两者都比cos(angle(y))快很多。)