【问题标题】:Embedding Python in C: Passing a two dimensional array and retrieving back a list在 C 中嵌入 Python:传递一个二维数组并检索一个列表
【发布时间】:2016-08-24 21:21:50
【问题描述】:

我想将数组(或二维数组)列表(例如 [[1,2,3],[4,5,6]])从 C 传递给 Python 脚本,该脚本计算并返回一个列表。为了实现这一点,嵌入code 需要进行哪些可能的更改?要执行的python脚本如下:

abc.py

import math
def xyz(size,wss):
    result=[0 for i in range(size)]
    for i in range(size):    
        wss_mag=math.sqrt(wss[i][0]*wss[i][0]+wss[i][1]*wss[i][1]+wss[i][2]*wss[i][2])
        result[i]=1/wss_mag
    return result

这里的大小是 WSS 中一维数组的数量(例如,wss=[[1,2,3],[4,5,6]] 的情况下为 2)问题与建议的副本不同,因为它必须将列表作为一维数组返回给 C。

【问题讨论】:

  • “数组列表”是什么意思?您不能将 C 数组放入 Python 列表中。
  • 我认为二维数组(就 C 而言)(就像 Python 中的列表列表)会更合适。您可以参考我给出的输入示例。
  • 我知道这不是一个完美的副本 - 他们使用的是 std::vector 而不是 2D C 数组,它们返回元组而不是列表 - 但它非常接近,答案很好,所以你应该大概能从中得到你想要的。
  • 谢谢,是的,它帮助我解决了我的第一部分查询,但是如何将列表返回给 C?

标签: python c arrays python-c-api python-embedding


【解决方案1】:

我认为您想要做的是传入一些列表,将它们转换为 C 数组,然后在返回 Python 之前返回列表。

列表在 C 中作为指向 PyObject 的指针接收,因此要从中获取数据,您必须使用 PyArg_ParseXX(YY),其中 XX 和 YY 取决于您在 Python 中拥有的列表对象类型以及您希望它如何在 C 中解释。您可以在此处指定输入列表的形状信息并将其转换为您需要处理的任何形状。

要将数组返回给 python,您必须查看 Python-C API,它提供了在 C 中创建和操作 Python 对象的方法。正如其他人建议的那样,使用 numpy-C API 也是一个选项很多优点。在这种情况下,您可以使用 PyArray_SimpleNew 创建一个数组并使用您的输出填充它。

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多