我遇到函数ascontiguousarray()的问题,它在NumPy 1.11.1和1.13.1中返回不同的步幅。
要重现的代码(Ubuntu 16.04,Python 2.7.12):
import os
import numpy as np
x = np.array([[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16]],dtype='uint32')
x = x.T
x = np.ascontiguousarray(x)
print(x.strides)
在NumPy 1.11.1中它返回步幅:(64,4)(在我看来是正确的步幅)
在NumPy 1.13.1中它返回步幅:(4,4)(意想不到的步幅)
感谢您提供解释或解决方案的所有帮助。
答案 0 :(得分:0)
我怀疑order
解释了这个意想不到的进步((4,4)
)。
普通的列数组:
In [289]: np.ones((3,1),int).strides
Out[289]: (4, 4)
普通行数组:
In [290]: np.ones((1,3),int).strides
Out[290]: (12, 4)
但是将行数组更改为命令F
,并且strides变得类似于列数组:
In [291]: np.ones((1,3),int,order='F').strides
Out[291]: (4, 4)
转置为F_contiguous
,与订单F
数组具有相同的步幅:
In [292]: np.ones((3,1),int).T.flags
Out[292]:
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
In [293]: np.ones((3,1),int).T.strides
Out[293]: (4, 4)
(np.ones((3,1),int)
也是连续的,因为一个维度是1)。
如果我强制转置到C
顺序,则步幅会发生变化:
In [305]: np.ones((3,1),int).T.copy(order='C').strides
Out[305]: (12, 4)
订单为F
的列数组:
In [312]: np.ones((3,1),int,order='F').strides
Out[312]: (4, 12)