通过C模块中的Python API访问数组的数组

在 C 模块中通过 Python API 访问数组的数组(即多维数组)涉及到使用 Python C API 来处理 Python 对象和数据结构。在 C 代码中访问这种数据结构时,我们可以使用 Python 的对象访问方式,例如 PyListPyArray(如果你使用的是 NumPy)来访问嵌套的数组。

在这里插入图片描述

1、问题背景

在 Python 中创建了一个包含数组的数组,并将其传递给 C 模块。我们需要通过 C 模块中的 Python API 访问此数组的每个子数组。

2、解决方案

为了访问传递给 C 模块的数组的数组,可以使用以下步骤:

  1. 在 C 模块中,使用 PyArray_SimpleNewFromData() 函数创建一个新的 NumPy 数组。此函数将创建一个新的数组,并使用提供的数据填充它。
  2. 将传递给 C 模块的数组的数组的元素复制到新创建的数组中。这可以使用 PyArray_CopyInto() 函数来完成。
  3. 使用 PyArray_NDIM() 函数获取新创建的数组的维度数。
  4. 使用 PyArray_SHAPE() 函数获取新创建的数组的形状。
  5. 使用 PyArray_GETPTR1() 函数获取新创建的数组的数据指针。
  6. 使用数据指针访问新创建的数组中的元素。

以下是一个代码示例:

# C 代码# 包含 NumPy 头文件
# conda install numpy
# pip install numpy
# apt-get install python3-numpy  (For Debian / Ubuntu)
# yum install python3-numpy  (For CentOS / Red Hat)
# dnf install python3-numpy  (For Fedora)
# zypper install python3-numpy  (For OpenSUSE)
# Include the necessary header files
# For Windows: Python.h must be placed in the project directory
# For Linux: python3.X/Include/Python.h
# For macOS: /Library/Frameworks/Python.framework/Versions/3.X/Headers/Python.h
# https://www.python.org/dev/embedding/
# https://www.oreilly.com/library/view/python-c-extension/0596001566/re314.html
# https://docs.python.org/3/c-api/array.html
# https://docs.scipy.org/doc/numpy/reference/c-api/c-api-intro.html
// https://stackoverflow.com/questions/5390264/numpy-array-of-objects-passing-to-c-and-access-to-these-objects-in-c
# https://docs.scipy.org/doc/numpy-1.15.1/reference/c-api/ndarray.html
# https://github.com/numpy/numpy/issues/11485
# https://github.com/numpy/numpy/issues/2662
# https://www.oreilly.com/library/view/python-c-extension/0596001566/re335.html
# https://stackoverflow.com/questions/47386916/how-to-create-a-numpy-array-of-objects-in-c-extension
// https://cs231n.github.io/python-numpy-tutorial/
# https://jonathannienaber.de/programming/python-native-memoryview-efficient-cpython-extension-types/
# https://numpy.org/doc/stable/c-api/c-api-reference.html
# https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html
# https://numpy.org/doc/stable/user/basics.types.html
// https://stackoverflow.com/questions/37056848/how-to-pass-a-numpy-array-from-python-to-c
// https://numpy.org/doc/stable/reference/c-api/shape.html
// https://stackoverflow.com/questions/68689338/convert-numpy-array-of-bytes-into-list-of-strings
# https://numpy.org/doc/stable/reference/c-api/array.html
// https://numpy.org/doc/stable/user/basics.creation.html#creating-arrays# https://numpy.org/doc/stable/reference/c-api/dtype.html
# https://numpy.org/doc/stable/reference/c-api/dtype_buffer.html
# https://numpy.org/doc/stable/reference/c-api/dtype_flag.html
# https://scipython.com/blog/interacting-between-python-and-c-data-structures/# 定义必要的变量和数据结构
PyObject *PyArray, *PySubArray;
int PyNumDims = 0;
npy_intp *PyShape = NULL;
PyArray_Descr *PyDtype = NULL;
void *PyDataPtr = NULL;// 将传递给 C 模块的数组的数组转换为兼容的 NumPy 数组
PyObject *PyArrayConvert(PyObject *PyArray) {// 检查输入数组是否为数组对象if (!PyArray_Check(PyArray)) {PyErr_SetString(PyExc_TypeError, "Input must be a NumPy array");return NULL;}// 检查输入数组是否是数组的数组PyNumDims = PyArray_NDIM(PyArray);if (PyNumDims != 2) {PyErr_SetString(PyExc_TypeError, "Input must be a 2-dimensional array");return NULL;}// 检查输入数组的元素类型是否兼容PyDtype = PyArray_DESCR(PyArray);if (PyDtype->type_num != NPY_OBJECT) {PyErr_SetString(PyExc_TypeError, "Input array must have object data type");return NULL;}// 将输入数组转换为兼容的 NumPy 数组PyArray = PyArray_FromArray(PyArray, PyArray_DescrFromType(NPY_OBJECT), NPY_ARRAY_DEFAULT);if (PyArray == NULL) {PyErr_SetString(PyExc_RuntimeError, "Failed to convert input array");return NULL;}return PyArray;
}// 从兼容的 NumPy 数组中提取数组的数组元素
PyObject **PyExtractSubArrays(PyObject *PyArray) {// 获取兼容的 NumPy 数组的形状和数据指针PyShape = PyArray_SHAPE(PyArray);PyDataPtr = PyArray_DATA(PyArray);// 分配内存来存储提取的数组的数组元素PyObject **PySubArrays = malloc(PyShape[0] * sizeof(PyObject *));if (PySubArrays == NULL) {PyErr_SetString(PyExc_MemoryError, "Failed to allocate memory for sub-arrays");return NULL;}// 提取兼容的 NumPy 数组的数组的数组元素for (int i = 0; i < PyShape[0]; i++) {PySubArrays[i] = ((PyObject **)PyDataPtr)[i];}return PySubArrays;
}// 释放提取的数组的数组元素的内存
void PyFreeSubArrays(PyObject **PySubArrays) {free(PySubArrays);
}// 在 C 模块中访问提取的数组的数组元素
void PyAccessSubArrays(PyObject **PySubArrays) {// 循环访问提取的数组的数组元素for (int i = 0; i < PyShape[0]; i++) {// 访问提取的数组的数组元素的元素for (int j = 0; j < PyShape[1]; j++) {// 根据需要访问提取的数组的数组元素的元素的值// printf("%d\n", ((int **)PySubArrays[i])[j]);}}
}// 在 C 模块中释放 kompatibler NumPy 数组的内存
void PyFreeArray(PyObject *PyArray) {Py_DECREF(PyArray);
}

请注意,此代码假设传递给 C 模块的数组的数组是一个二维数组,并且它的元素是对象。如果数组的数组具有不同的维度或元素类型,则需要修改代码以支持不同的情况。

以下是一个 Python 代码示例,演示如何使用上述 C 代码访问数组的数组:

# Python 代码# 导入必要的库
import numpy as np
import geoms# 创建一个包含数组的数组
A=np.empty((1,2),dtype=object)
A[0,0] = np.random.rand(3,3)
A[0,1] = np.random.rand(5,5)# 将数组的数组传递给 C 模块
geoms.gm_unique_all(A)

总结:

在 C 模块中通过 Python API 访问数组的数组时,首先需要确保传入的是正确的 Python 数据类型(如 PyList)。

使用 PyList_SizePyList_GetItem 来遍历数组的数组,并通过 PyLong_AsLong 或其他类型转换函数将元素转换为 C 类型。

这种方法可以让你直接访问 Python 中的多维数组,并在 C 中进行操作或处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16440.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【IDEA】2017版本的使用

目录 一、常识 二、安装 1. 下载IDEA2017.exe 2. 安装教程 三、基本配置 1. 自动更新关掉 2. 整合JDK环境 3. 隐藏.idea文件夹和.iml等文件 四、创建Java工程 1. 新建项目 2. 创建包结构&#xff0c;创建类&#xff0c;编写main主函数&#xff0c;在控制台输出内容。…

物联网智能语音控制灯光系统设计与实现

背景 随着物联网技术的蓬勃发展&#xff0c;智能家居逐渐成为现代生活的一部分。在众多智能家居应用中&#xff0c;智能灯光控制系统尤为重要。通过语音控制和自动调节灯光&#xff0c;用户可以更便捷地操作家中的照明设备&#xff0c;提高生活的舒适度与便利性。本文将介绍一…

利用HTML和css技术编写学校官网页面

目录 一&#xff0c;图例展示 二&#xff0c;代码说明 1&#xff0c;html部分&#xff1a; 【第一张图片】 【第二张图片】 【第三张图片】 2&#xff0c;css部分&#xff1a; 【第一张图片】 【第二张图片】 【第三张图片】 三&#xff0c;程序代码 一&#xff0c;…

学习笔记十九:K8S生成pod过程

K8S生成pod过程 流程图具体生成过程用户提交 Pod 定义API Server 处理请求调度器分配节点&#xff08;Scheduling&#xff09;目标节点上的 Pod 创建网络配置状态上报与监控控制器管理&#xff08;Controller Manager&#xff09;就绪与服务发现 关键错误场景高级特性 流程图 具…

(一)Axure制作移动端登录页面

你知道如何利用Axure制作移动端登录页面吗&#xff1f;Axure除了可以制作Web端页面&#xff0c;移动端也是可以的哦&#xff0c;下面我们就一起来看一下Axure制作移动端登录页面的过程吧。 第一步&#xff1a;从元件中拖入一个矩形框&#xff0c;并设置其尺寸为&#xff1a;37…

【C++】——精细化哈希表架构:理论与实践的综合分析

先找出你的能力在哪里&#xff0c;然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表&#xff1a;核心概念与引入 2. 哈希表的底层机制&#xff1a;原理与挑战 2.1 核心功能解析&#xff1a;效率与灵活性的平衡 2.2 哈希冲突的本质&#x…

第5章 数据库系统(选择|案例|论文)(重点★★★★★)

5.1 数据库管理系统1 数据库是长期存储在计算机内的、有组织的、可共享的数据集合&#xff0c;数据库系统是指在计算机信息系统中引入数据库后的系统&#xff0c;一般由数据库、数据库管理系统 (DataBaseManagement System&#xff0c;DBMS)、应用系统、数据库管理员(DataBase…

jenkins备份还原配置文件

下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意&#xff1a;有时可能因为网络或者版本问题下载不了&#xff0c;好像是默认下载最新版本&#xff0c;可选择手动安装&#xff01; 方式二 手动安装插件 点击查看手…

Vue笔记(八)

一、Pinia &#xff08;一&#xff09;手动添加Piaia到Vue项目 1.安装Pinia&#xff1a;使用包管理器进行安装&#xff0c;在项目目录下运行 npm install pinia 或 yarn add pinia &#xff0c;为项目引入Pinia状态管理库。 2.创建Pinia实例&#xff1a;在项目的JavaScript代…

vue纯静态实现 视频转GIF 功能(附源码)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、实现后的效果二、使用步骤1.引入库2.下载or复制出来js3. 前端实现 总结 前言 一天一个小demo 今天来一个vue纯静态实现 视频转GIF 功能 上一篇我们讲到了…

嵌入式八股文面试题(二)C语言算法

相关概念请查看文章&#xff1a;C语言概念。 1. 如何实现一个简单的内存池&#xff1f; 简单实现&#xff1a; #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…

【Python】集合

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;Python 文章目录 1. 集合的创建2. 集合的基本操作2.1 访问集合元素2.2 添加元素2.3 删除元素 3. 集合的数学运算3.1 交集&#xff08;& 或 intersection() 方法&#xff09;3.2 并集&#xff08;| 或 union() 方法&#xf…

Flutter_学习记录_基本组件的使用记录_2

1. PopupMenuButton的使用 代码案例&#xff1a; import package:flutter/material.dart;// ----PopupMemuButtonDemo的案例---- class PopupMemuButtonDemo extends StatefulWidget {const PopupMemuButtonDemo({super.key});overrideState<PopupMemuButtonDemo> crea…

基于java手机销售网站设计和实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

初识计算机网络

从此篇我将开始网络新篇章&#xff01; 1. 网络发展史 最初的计算机之间相互独立存在&#xff0c;每个计算机只能持有自己的数据&#xff0c;数据无法共享。此时的计算机为独立模式 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#x…

PyTorch 中 `torch.cuda.amp` 相关警告的解决方法

在最近的写代码过程中&#xff0c;遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…

【PS 2022】Adobe Genuine Service Alert 弹出

电脑总是弹出Adobe Genuine Service Alert弹窗 1. 不关掉弹窗并打开任务管理器&#xff0c;找到Adobe Genuine Service Alert&#xff0c;并右键进入文件所在位置 2 在任务管理器中结束进程并将文件夹中的 .exe 文件都使用空文档替换掉 3. 打开PS不弹出弹窗&#xff0c;解决&a…

Vue2生命周期面试题

在 Vue 2 中&#xff0c;this.$el 和 this.$data 都是 Vue 实例的属性&#xff0c;代表不同的内容。 1. this.$el this.$el 是 Vue 实例的根 DOM 元素&#xff0c;它指向 Vue 实例所控制的根节点元素。在 Vue 中&#xff0c;el 是在 Vue 实例创建时&#xff0c;指定的根元素&…

unity 安装Entities

因为Entities目前不支持用资源名动态加载资源&#xff01;没错&#xff0c;AssetsBundle或Addressables都不能用于Entities&#xff1b;也就意味着现阶段不能用Entities开发DLC或热更游戏。 Entities必须使用SubScene&#xff0c;而SubScene不能从资源动态加载&#xff0c;路被…

基于 PyTorch 的树叶分类任务:从数据准备到模型训练与测试

基于 PyTorch 的树叶分类任务&#xff1a;从数据准备到模型训练与测试 1. 引言 在计算机视觉领域&#xff0c;图像分类是一个经典的任务。本文将详细介绍如何使用 PyTorch 实现一个树叶分类任务。我们将从数据准备开始&#xff0c;逐步构建模型、训练模型&#xff0c;并在测试…