我想将以下整数列表数组(即,不是二维数组)从python代码传递给Cython方法。
Python示例代码:
import numpy as np
import result
a = np.array([[1], [2,3]])
process_result(a)
的输出a
是array([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'
请协助我如何a
将Cython
方法的值传递给方法,process_result
以及datatype
在Cython
方法中接收此值需要使用的确切条件。
我认为您使用的是错误的数据类型。您应该使用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
在这里,我假设您最有可能想要遍历列表。请注意,键入a
be几乎没有什么好处list
,因此您可以不进行输入(接受任何Python对象),然后再将其传递给其他可迭代对象,例如原始的numpy数组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句