python如何调用c++numpy.ndarray代码_将一个NUMPY数组传递给C++

本文介绍了如何在C++中调用Python模块,特别是处理Numpy数组。通过设置PYTHONPATH环境变量,初始化Python解释器,并使用Cython导出的函数,可以从C++直接获取和操作Numpy数组。此外,还提供了一个示例程序展示了如何在C++中获取、打印和释放Numpy数组的数据。
摘要由CSDN通过智能技术生成

简短回答

NameError的原因是Python找不到模块,工作目录不会自动添加到您的^{}。在C/C++代码中使用^{}和setenv("PYTHONPATH", ".", 1);可以解决这个问题。

更长的答案

显然,有一个简单的方法可以做到这一点。使用包含已创建数组的python模块pythonmodule.py:import numpy as np

result = np.arange(20, dtype=np.float).reshape((2, 10))

您可以使用pymodule.pyx来导出该数组。通过添加一些辅助函数,您通常不需要触碰Python或NumpyC-API:from pythonmodule import result

from libc.stdlib cimport malloc

import numpy as np

cimport numpy as np

cdef public np.ndarray getNPArray():

""" Return array from pythonmodule. """

return result

cdef public int getShape(np.ndarray arr, int shape):

""" Return Shape of the Array based on shape par value. """

return arr.shape[1] if shape else arr.shape[0]

cdef public void copyData(float *** dst, np.ndarray src):

""" Copy data from src numpy array to dst. """

cdef float **tmp

cdef int i, j, m = src.shape[0], n=src.shape[1];

# Allocate initial pointer

tmp = malloc(m * sizeof(float *))

if not tmp:

raise MemoryError()

# Allocate rows

for j in range(m):

tmp[j] = malloc(n * sizeof(float))

if not tmp[j]:

raise MemoryError()

# Copy numpy Array

for i in range(m):

for j in range(n):

tmp[i][j] = src[i, j]

# Assign pointer to dst

dst[0] = tmp

函数getNPArray和getShape分别返回数组及其形状。^添加{}只是为了提取^{}并复制它,这样您就可以完成Python并在不初始化解释器的情况下工作。

示例程序(在C,C++中应该看起来相同)如下所示:#include

#include "numpy/arrayobject.h"

#include "pyxmod.h"

#include

void printArray(float **arr, int m, int n);

void getArray(float ***arr, int * m, int * n);

int main(int argc, char **argv){

// Holds data and shapes.

float **data = NULL;

int m, n;

// Gets array and then prints it.

getArray(&data, &m, &n);

printArray(data, m, n);

return 0;

}

void getArray(float ***data, int * m, int * n){

// setenv is important, makes python find

// modules in working directory

setenv("PYTHONPATH", ".", 1);

// Initialize interpreter and module

Py_Initialize();

initpyxmod();

// Use Cython functions.

PyArrayObject *arr = getNPArray();

*m = getShape(arr, 0);

*n = getShape(arr, 1);

copyData(data, arr);

if (data == NULL){ //really redundant.

fprintf(stderr, "Data is NULL\n");

return ;

}

Py_DECREF(arr);

Py_Finalize();

}

void printArray(float **arr, int m, int n){

int i, j;

for(i=0; i < m; i++){

for(j=0; j < n; j++)

printf("%f ", arr[i][j]);

printf("\n");

}

}

始终记住设置:setenv("PYTHONPATH", ".", 1);

在调用Py_Initialize之前,Python可以在工作目录中找到模块。

其余的都是直截了当的。它可能需要一些额外的错误检查,肯定需要一个函数来释放分配的内存。

不含Cython的备用方式:

以您正在尝试的方式来做这件事是非常麻烦的,您最好使用^{}将数组保存在npy二进制文件中,然后使用一些C++ library that reads that file for you。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值