Python numpy插入轴使数据不连续

Python numpy插入轴使数据不连续,python,numpy,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 OWND

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

>>> 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
update对于那些可能在搜索中找到此项的人,要保持当前数组的顺序在一个整形中,
a.整形(3,1,4,order='a')
工作并保持一个连续数组的连续性



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

这并不能回答您的问题,但可能有一些用处: 您还可以使用
np.require(a[np.newaxis,…],requirements='FA').flags

C\u连续:False

F_连续:True

OWNDATA:True

可写:True

ALIGNED:True


UPDATEIFCOPY:False

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