numpy插入轴使数据不连续

时间:2013-05-21 18:09:21

标签: python numpy

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

>>> 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数据,所以我用新的维度填充数组,以使它们达到所需的维数。我想保留连续的数据以避免拷入/拷出行为。

1 个答案:

答案 0 :(得分: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