Numpy C-Api改变了从列到行的排序

时间:2016-03-04 15:49:22

标签: python c arrays numpy cython

将numpy数组传递给c扩展名时更改numpy数组顺序的最佳方法是什么?对于我正在使用cython和numpy的PyArray_DATA

的界面

假设我有x = np.empty((2000,10))并且我想将该数组传递给C,以便x[2000]对应于python中的x[0,1]x[1]x[1,0]。 我该怎么做?

到目前为止,我尝试了np.copy(oder='C')np.transpose()np.reshape((-1))np.flatten的各种组合。

1 个答案:

答案 0 :(得分:0)

您似乎对术语列和行专业感到困惑。 Row-majororder='c'Column-majororder='f'。这是一个显示例子的例子

shape = (2000, 10)
buffer = "".join("{:5d}".format(i) for i in range(np.prod(shape)))
x = np.ndarray(shape, 'S5', order='f', buffer=buffer)
print x[0, 1]
# ' 2000'
print x.flags
#   C_CONTIGUOUS : False
#   F_CONTIGUOUS : True
#   OWNDATA : False
#   WRITEABLE : False
#   ALIGNED : False
#   UPDATEIFCOPY : False
x = np.ndarray((2000, 10), 'S5', order='c', buffer=buffer)
print x[0, 1]
# '    1'
print x.flags
#   C_CONTIGUOUS : True
#   F_CONTIGUOUS : False
#   OWNDATA : False
#   WRITEABLE : False
#   ALIGNED : False
#   UPDATEIFCOPY : False

有几种方法可以在numpy中强制使用内存布局,这里有一些:

# When you create the array:
x = np.empty((2000, 10), order='f')

# Check the order and copy if needed:
x = np.asfortranarray(x)

# Force a copy:
x_fortran = x.copy(order='f')

请注意,所有这3个方法都会生成一个“相同”的numpy数组,即对所有python代码看起来都一样:

print np.all(x.copy('c') == x.copy('f'))
# True