【问题标题】:numpy inserting axis makes data non-contiguousnumpy 插入轴使数据不连续
【发布时间】:2013-05-21 18:09:21
【问题描述】:

为什么插入新轴会使数据不连续?

>>> a = np.arange(12).reshape(3,4,order='F')
>>> a
array([[ 0,  3,  6,  9],
       [ 1,  4,  7, 10],
       [ 2,  5,  8, 11]])
>>> a.reshape((3,1,4)).flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
>>> a[np.newaxis,...].flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
>>> a.flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

请注意,如果我使用C 排序,它会在我重塑时保持连续数据,但在我添加新轴时不会:

>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> a.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

>>> a.reshape(3,1,4).flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
>>> a[np.newaxis,...].flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

更新对于那些可能在搜索中找到此内容的人,为了保持当前数组顺序处于重塑状态,a.reshape(3,1,4,order='A') 可以工作并保持连续数组的连续性。


对于那些问“你为什么关心?”的人,这是一个脚本的一部分,它以 fortran 顺序将数组传递给通过f2py 编译的一些 fortran 子例程。 fortran 例程需要 3D 数据,因此我使用新维度填充数组以使它们达到所需的维度数。我想保留连续的数据以避免复制/复制行为。

【问题讨论】:

  • @JoeKington -- 是的。我也是那么想的。既然我发现了order='A',我就可以使用ndarray.reshape。我更喜欢np.newaxis 虽然data = a[newaxis,...] 看起来比data = a.reshape((1,)+a.shape,order='A') 更干净
  • 我打赌这与最近在 numpy 邮件列表上的巨大讨论有关:numpy-discussion.10968.n7.nabble.com/… 我当然同意这令人困惑!我从来没有想到用newaxis 切片会做到这一点!
  • @mgilson 只是添加:您不必添加新轴来查看此行为。 np.swapaxes,np.reshape,np.transpose都默认将数据设为C_CONTIGUOUS...
  • 我不确定您为什么需要 order 参数。但如果它让你高兴,那基本上只是标志过于严格,从 1.8 开始。 numpy 可以通过轻松的步幅检查进行编译,最终将成为默认值。
  • 啊,是的,好吧,如果没有订单,它会以一种标志再次被破坏的方式填充步伐......

标签: python numpy


【解决方案1】:

这并不能回答您的问题,但可能会有一些用处: 您也可以使用 numpy.require np.require(a[np.newaxis,...], requirements='FA').flags
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False

【讨论】:

    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多