取实部或虚部使数组在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)
- 它们都是连续的,那么我实际上可以通过执行 cos
或 sin
of [=15] 来找到实部和虚部=].为什么使用 real
或 imag
会使数组不连续?错误?
y.real
和 y.imag
只是让您查看每隔 8 个字节跳过的 y
数组。注意到 OWNDATA: False
标志了吗?这就是它的意思:它们只是对其他人数据的一种看法。这也是为什么它们不连续的原因。这不是错误,这是优化。
abs
和 angle
必须构建一个全新的数组。这是连续的,但这也意味着您只花费了线性时间 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))
快很多。)
我有一个 numpy 数组,我需要它是 F 连续的 C-(对于 paraview
):
t=np.linspace(0,10)
y=exp(1j*t)
到目前为止它是连续的,我通过 y.flags
检查。
但是当我取这个数组的实部或虚部时 - 它变得不连续,例如 y.real.flags
表明。另一方面,如果我取 abs(y)
或 angle(y)
- 它们都是连续的,那么我实际上可以通过执行 cos
或 sin
of [=15] 来找到实部和虚部=].为什么使用 real
或 imag
会使数组不连续?错误?
y.real
和 y.imag
只是让您查看每隔 8 个字节跳过的 y
数组。注意到 OWNDATA: False
标志了吗?这就是它的意思:它们只是对其他人数据的一种看法。这也是为什么它们不连续的原因。这不是错误,这是优化。
abs
和 angle
必须构建一个全新的数组。这是连续的,但这也意味着您只花费了线性时间 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))
快很多。)