【问题标题】:taking real or imaginary part makes array not C-contigous in numpy取实部或虚部使数组在 numpy 中不是 C 连续的
【发布时间】:2018-05-03 05:32:25
【问题描述】:

我有一个 numpy-array,我需要它是 F-contiguous 的 C-(对于 paraview):

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

【问题讨论】:

    标签: python numpy numpy-ndarray


    【解决方案1】:

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

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

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

    >>> 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,但我很确定它只是调用require。 (无论如何,任何一个都会比cos(angle(y))快很多。)

    【讨论】:

    • 谢谢,目前对我来说,这种优化非常奇怪和不直观,因为所有其他 (?) 与函数的映射都是连续的。不过也许我以后会明白的。
    • @Sleepyhead 这是一种优化,因为它不必复制数组。这对大型数组有很大的不同——它不是为 100 万个新行分配空间并循环和复制超过 100 万个新值,它只是创建一个新的小数组句柄,指向内存中现有的 100 万行,跨步表示“每隔 8 个字节跳过一次”的标志
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2018-12-20
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多