将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
的各种组合。
答案 0 :(得分:0)
您似乎对术语列和行专业感到困惑。 Row-major
为order='c'
,Column-major
为order='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