函数ascontiguousarray在NumPy 1.11.1和1.13.1中返回不同的步幅

时间:2017-09-14 18:48:13

标签: python numpy

我遇到函数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)(意想不到的步幅)

感谢您提供解释或解决方案的所有帮助。

1 个答案:

答案 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)