0

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

t=np.linspace(0,10) y=exp(1j*t) 到目前为止它是连续的,我通过y.flags. 但是当我取这个数组的实部或虚部时——它变得不连续,例如y.real.flags显示。另一方面,如果我采用abs(y)or angle(y)- 它们都是连续的,那么我实际上可以通过 do cosor sinof找到实部和虚部angle(y)。为什么采取realimag使阵列不连续?漏洞?

4

1 回答 1

1

y.real并且y.imag只是让您查看y每隔 8 个字节跳过的数组。注意到那OWNDATA: False面旗帜了吗?这就是它的意思:它们只是对他人数据的看法。这也是它们不连续的原因。不是bug,是优化。

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

于 2018-05-03T05:44:47.070 回答