【问题标题】:Python numpy array slices are not Fortran ContiguousPython numpy 数组切片不是 Fortran 连续的
【发布时间】:2020-01-15 14:01:06
【问题描述】:

我已经定义了一个 Fortran 连续数组:

   import numpy as np

   hp  = np.zeros([number_fragments, max(length_fragments_list), 6], order='F')

此数组的切片不是 Fortran 连续的。我该如何解决?

hn = hp[0,0:Length-1,:]

   hn.flags

  C_CONTIGUOUS : False

  F_CONTIGUOUS : False

also

   hn = hp[0,0:Length-1,:].copy()

   hn.flags

  C_CONTIGUOUS : True

  F_CONTIGUOUS : False

如何在切片后轻松获得 Fortran 连续数组?

【问题讨论】:

  • 我通常不关注flags属性。了解strides 更好。有时我也会看hn.__array_interface__
  • 谢谢。不幸的是,当我将切片数组发送到 Fortran 包装函数时,它说输入不是 Fortran 连续的。所以,它需要修复。
  • 使用“F”顺序,最后一个维度是外部维度。像hp[:,:-1, 0] 这样的索引保持'F' 连续性(但会破坏最初'C' 数组的'C' 连续性)。 copy 接受订单参数。

标签: python arrays numpy f2py contiguous


【解决方案1】:

您可以在切片上应用 numpy 函数 np.asfortranarray 来强制执行它,例如:

 np.asfortranarray(hp[0,0:Length-1,:].copy())

【讨论】:

  • @DavoodNorouzi,很酷,不要犹豫,验证/提升答案;)
  • asfortranarray 之后是否需要copy?我认为hp[0,0:Length-1,:].copy(order='F') 也可以。
  • @hpaulj, asfortranarray 一个人,根据我的经验,不要复制价值。所以是的,在需要数组副本的情况下,您的解决方案似乎更合适。
  • 实际代码为np.array(a, dtype, copy=False, order='F', ndmin=1)copy=False 表示非必要不要复制,需要时可以复制。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 2015-06-06
  • 2020-12-11
  • 2011-08-30
  • 2017-08-09
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
相关资源
最近更新 更多