为什么插入新轴会使数据不连续?
>>> 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
排序,它会在我 reshape 时保持连续的数据,但在我添加新轴时不会:
>>> 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
更新 对于那些可能会在搜索中找到它的人来说,为了保持当前数组顺序在 reshape 中,a.reshape(3,1,4,order='A')
工作并保持连续数组连续。
对于那些问“你为什么关心?”的人,这是一个脚本的一部分,该脚本以 fortran 顺序将数组传递给一些通过 f2py
编译的 fortran 子例程。 Fortran 例程需要 3D 数据,因此我用新的维度填充数组以使它们达到所需的维度数。我想保留连续的数据以避免复制输入/复制输出行为。
最佳答案
这不能回答您的问题,但可能会有一些用处:
您还可以使用 numpy.require
np.require(a[np.newaxis,...], requirements='FA').flags
C_CONTIGUOUS:假
F_CONTIGUOUS:真
OWNDATA:真
可写:真
对齐:真
UPDATEIFCOPY:假
关于python - numpy 插入轴使数据不连续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16676661/