gpt4 book ai didi

python - 在 Numpy C 扩展中返回可变长度数组?

转载 作者:太空宇宙 更新时间:2023-11-04 01:41:16 26 4
gpt4 key购买 nike

在这个 site 的大力帮助下,我之前做了一些 Numpy C 扩展, 但据我所知,返回的参数都是固定长度的。

有没有办法让 Numpy C 扩展返回一个可变长度的 numpy 数组?

最佳答案

您可能会发现使用 Numpy C-API 在 Cython 中制作 numpy 扩展更容易,这简化了过程,因为它允许您混合 python 和 c 对象。在这种情况下,制作可变长度数组并不困难,您可以简单地指定一个具有任意形状的数组。

Cython numpy tutorial可能是该主题的最佳来源。

例如,这是我最近写的一个函数:

import numpy as np
cimport numpy as np
cimport cython

dtype = np.double
ctypedef double dtype_t

np.import_ufunc()
np.import_array()

def ewma(a, d, axis):
#Calculates the exponentially weighted moving average of array a along axis using the parameter d.
cdef void *args[1]

cdef double weight[1]
weight[0] = <double>np.exp(-d)


args[0] = &weight[0]

return apply_along_axis(&ewma_func, np.array(a, dtype = float), np.double, np.double, False, &(args[0]), <int>axis)

cdef void ewma_func(int n, void* aData,int astride, void* oData, int ostride, void** args):
#Exponentially weighted moving average calculation function

cdef double avg = 0.0
cdef double weight = (<double*>(args[0]))[0]
cdef int i = 0

for i in range(n):

avg = (<double*>((<char*>aData) + i * astride))[0]*weight + avg * (1.0 - weight)


(<double*>((<char*>oData) + i * ostride))[0] = avg

ctypedef void (*func_1d)(int, void*, int, void*, int, void **)

cdef apply_along_axis(func_1d function, a, adtype, odtype, reduce, void** args, int axis):
#generic function for applying a cython function along a particular dimension

oshape = list(a.shape)

if reduce :
oshape[axis] = 1

out = np.empty(oshape, odtype)

cdef np.flatiter ita, ito

ita = np.PyArray_IterAllButAxis(a, &axis)
ito = np.PyArray_IterAllButAxis(out, &axis)

cdef int axis_length = a.shape[axis]
cdef int a_axis_stride = a.strides[axis]
cdef int o_axis_stride = out.strides[axis]

if reduce:
o_axis_stride = 0

while np.PyArray_ITER_NOTDONE(ita):

function(axis_length, np.PyArray_ITER_DATA (ita), a_axis_stride, np.PyArray_ITER_DATA (ito), o_axis_stride, args)

np.PyArray_ITER_NEXT(ita)
np.PyArray_ITER_NEXT(ito)

if reduce:
oshape.pop(axis)
out.shape = oshape

return out

如果这不适合您,可以使用一个函数来创建一个具有任意形状的新空数组 (link)。

关于python - 在 Numpy C 扩展中返回可变长度数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4625237/

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