从Python的Cython方法中传递整数列表的numpy数组

斯雷达兰

我想将以下整数列表数组(即,不是二维数组)从python代码传递给Cython方法。

Python示例代码

import numpy as np
import result
a = np.array([[1], [2,3]])
process_result(a)

的输出aarray([list([1]), list([2, 3])], dtype=object)

Cython示例代码

def process_result(int[:,:] a):
    pass

上面的代码给出以下错误:

ValueError: Buffer has wrong number of dimensions (expected 2, got 1)

我试图传递一个简单的数组而不是numpy我遇到了以下错误

a = [[1], [2,3]]
process_result(a)

TypeError: a bytes-like object is required, not 'list'

请协助我如何aCython方法的值传递给方法,process_result以及datatypeCython方法中接收此值需要使用的确切条件

戴维

我认为您使用的是错误的数据类型。您应该使用numpy数组列表,而不是列表的numpy数组。使用numpy的Python对象数组(例如列表)几乎没有什么好处-与数字类型不同,它们没有特别有效地存储,它们无法快速进行计算,并且您无法在Cython中加速它们。因此,最外层也可能是普通的Python列表。

但是,内部级别看起来都是整数的同质数组,因此是Numpy数组的理想候选对象(尤其是如果要在Cython中处理它们)。

因此,将您的列表构建为:

a = [ np.array([1],dtype=np.int), np.array([2,3],dtype=np.int) ]

(或tolist在numpy数组上使用)

对于您的功能,您可以像下面这样定义:

def process_result(list a):
    cdef int[:] item
    for item in a:
        #operations on the inner arrays are fast!
        pass

在这里,我假设您最有可能想要遍历列表。请注意,键入abe几乎没有什么好处list,因此您可以不进行输入(接受任何Python对象),然后再将其传递给其他可迭代对象,例如原始的numpy数组。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章