我有一个数字数组,我需要它是 F 连续的 C- (对于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
使数组不连续?错误?
>y.real
和y.imag
只是为您提供了每隔8个字节跳过的y
数组的视图。注意到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))
快得多。