【问题标题】:Numpy C-Api change ordering from column to row majorNumpy C-Api 从列到行主要更改排序
【发布时间】:2026-01-15 22:00:01
【问题描述】:

在将 numpy 数组传递给 c 扩展时,更改其顺序的最佳方法是什么?对于界面,我使用 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 的各种组合。

【问题讨论】:

    标签: python c arrays numpy cython


    【解决方案1】:

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

    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
    

    【讨论】:

    • 感谢您的澄清。我的具体问题出现了,因为有问题的数组在程序的 python 部分中被解释为 (2000,10),但由于性能原因,该数组在 C 扩展中应该被解释为 (10,2000)。我基本上需要的是某种方式来强制改变数组在内存中的存储方式。
    • 听起来你想强制“fortran”布局。我的回答中的 3 种方法中的任何一种都可以满足您的需求。