将 3D numpy 数组从 cython 传递到 C++

Posted

技术标签:

【中文标题】将 3D numpy 数组从 cython 传递到 C++【英文标题】:Passing 3D numpy array from cython to C++ 【发布时间】:2014-01-03 19:23:30 【问题描述】:

我最近使用 cython 来加快应用程序的速度,但现在正在努力 函数。我可以从 python 测试脚本中调用我的函数,但它会出现段错误。当我自己测试我的 C++ 时,它没有。因此,我认为我在正确传递数组时做错了。

那里出了什么问题?

 >> python test_harvest.py   

   (100, 100) I twerk 
   [1] 6771 segmentation fault (core dumped)  python    test_harvest.py

logic.pyx

import cython

import numpy as np
cimport numpy as np

cdef extern from "fast_harvest.h":
    void start_harvest(int *** data , int x, int y, int t, int n)

def harvest(np.ndarray[int, ndim=3, mode="c"] data not None, 
            int goal_x, 
            int goal_y, 
            int mission_time, 
            int number_of_robots): 

    m, n, o = data.shape[0], data.shape[1], data.shape[2]

    assert m == mission_time
    assert n == number_of_robots
    assert o == 2

    start_harvest (<int ***> data.data,
                   goal_x, goal_y, 
                   mission_time, 
                   number_of_robots)

fast_harvest.cpp

#include <iostream>
#include <cstdio>
#include "fast_harvest.h"
#include "Harvester.h"

using std::cout;
using std::endl;

void start_harvest(int ***data, int x, int y, int mission_time, int number_of_robots) 
    Point p(x,y);
    p.dump();
    cout << "I twerk" << endl;

    for(int n = 0; n < number_of_robots; n++) 
        int xpos = data[0][n][0];
        int ypos = data[0][n][1];
        printf("(%d, %d)\n", xpos, ypos);
    

test_harvest.py

import numpy as np

import fharvest.logic as fhl


ROBO_COUNT = 2
MISSION_TIME = 20

GOAL_X = 100
GOAL_Y = 100    

data = np.zeros([MISSION_TIME, ROBO_COUNT, 2], dtype=int)

data[0][0] = 0, 200
data[0][1] = 200, 0

fhl.harvest(data, GOAL_X, GOAL_Y, MISSION_TIME, ROBO_COUNT)

print(data)

【问题讨论】:

3D numpy 数组不是指向指针的数组,它是(某种)连续的内存块,带有一些描述其形状的元数据(步幅),这就解释了为什么它是段错误。也许here的一些帖子可以帮助到你! 【参考方案1】:

我最终做的是将一维数组传递给 C++,并为它编写了一个包装类来进行从 3D 到 1D 坐标的转换。我的实际程序有其内部数据结构。完成工作后,我将包装器传递给主类,并将其状态复制到包装的一维缓冲区。

【讨论】:

你可以在我的 github 上找到最终起作用的东西,github.com/Rentier/manganese-harvest-logic 用于 cpp,github.com/Rentier/manganese-harvest-core 用于 Python。

以上是关于将 3D numpy 数组从 cython 传递到 C++的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 cython 将 numpy 数组列表传递给 c++

如何正确地将 numpy 数组传递给 Cython 函数?

将 numpy 数组传递给 C++

Cython 中 numpy 数组掩码的性能

Cython:从参考获得时,Numpy 数组缺少两个第一个元素

使用 Cython 加速连接组件算法