gpt4 book ai didi

python - 在 Cython 中访问 NumPy 记录数组列

转载 作者:太空狗 更新时间:2023-10-30 00:11:50 24 4
gpt4 key购买 nike

我是一个比较有经验的 Python 程序员,但是很长一段时间没有写过任何 C,正在尝试了解 Cython。我正在尝试编写一个 Cython 函数,它将在 NumPy 重载数组的列上运行。

我目前的代码如下。

recarray_func.pyx:

import numpy as np
cimport numpy as np

cdef packed struct rec_cell0:
np.float32_t f0
np.int64_t i0, i1, i2

def sum(np.ndarray[rec_cell0, ndim=1] recarray):
cdef Py_ssize_t i
cdef rec_cell0 *cell
cdef np.float32_t running_sum = 0

for i in range(recarray.shape[0]):
cell = &recarray[i]
running_sum += cell.f0
return running_sum

在解释器提示符下:

array = np.recarray((100, ), names=['f0', 'i0', 'i1', 'i2'],
formats=['f4', 'i8', 'i8', 'i8'])
recarray_func.sum(array)

这只是对 recarray 的 f0 列求和。它可以毫无问题地编译和运行。

我的问题是,我该如何修改它以便它可以对任何列进行操作?在上面的示例中,要求和的列是硬编码的,并通过点符号访问。是否可以更改函数以便将要求和的列作为参数传入?

最佳答案

我相信这应该可以使用 Cython 的 memoryviews .这些方面的东西应该可以工作(代码未经测试):

import numpy as np
cimport numpy as np

cdef packed struct rec_cell0:
np.float32_t f0
np.int64_t i0, i1, i2

def sum(rec_cell0[:] recview):
cdef Py_ssize_t i
cdef np.float32_t running_sum = 0

for i in range(recview.shape[0]):
running_sum += recview[i].f0
return running_sum

通过确保传递给 Cython 的记录数组是连续的,可以提高速度。在python(调用)端,可以使用np.require,而函数签名应该改为rec_cell0[::1] recview,表示数组可以假设是连续的。和往常一样,一旦代码经过测试,关闭 boundscheckwraparoundnonecheck compiler directives在 Cython 中可能会进一步提高速度。

关于python - 在 Cython 中访问 NumPy 记录数组列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9423207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com