gpt4 book ai didi

python - 在 Python 的 Cython 方法中传递整数列表的 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:57 24 4
gpt4 key购买 nike

我想将以下整数列表数组(即,它不是二维数组)从 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 以及在 Cython 方法中需要使用什么确切的 datatype 来接收这个值。

最佳答案

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

但是,内部层次看起来都是同质整数数组,因此是 Numpy 数组的理想候选者(特别是如果您想在 Cython 中处理它们)。

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

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

(或者在 numpy 数组上使用 tolist)

对于您的函数,您可以像这样定义它:

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

在这里,我假设您很可能想要遍历列表。请注意,将 a 键入为 list 几乎没有什么好处,因此您可以将其保留为无类型(以接受任何 Python 对象),然后您也可以将其传递给其他可迭代对象,就像您原来的 numpy 数组一样。

关于python - 在 Python 的 Cython 方法中传递整数列表的 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50809244/

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