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可以通过轻松的步幅检查进行编译,最终将成为默认值。啊,是的,好吧,如果没有顺序,它将以一种使标志再次损坏的方式填充步幅。。。