用c ++指针创建ndarray

时间:2015-06-18 09:40:50

标签: python c++ pointers numpy cython

我用c ++创建了一个模块,需要在python中使用结果。

已经写了一个包装器,它正在使用这段代码

a = np.empty([r, hn])
    for i in xrange(r):
        for j in xrange(hn):
            a[i,j]=self.thisptr.H[i*hn+j]
return a

代码正在运行,但我认为应该有一种更简单,更快捷的方法来处理指针数据。 可悲的是,我不习惯python和cython,不能自己解决。

任何帮助将不胜感激。 :)

2 个答案:

答案 0 :(得分:0)

键入的记忆视图(http://docs.cython.org/src/userguide/memoryviews.html)是您的朋友。

Meteor.isClient

它可能不会更快(在内部它是一个非常类似于你写的循环),但它更容易。

或者,更简单,只需使用文档中的示例(http://docs.cython.org/src/userguide/memoryviews.html#coercion-to-numpy

a = np.empty([r,hn])
# interpret the array as a typed memoryview of shape (r, hn)
# and copy into a
# I've assumed the array is of type double* for the sake of answering the question
a[...] = <double[:r,:hn]>self.thisptr.H

答案 1 :(得分:0)

一种可能的方法是在C中手动编写包装器.Python对象的结构可以包含指向C ++对象的指针。看看我的代码(我这是2005年),我看到我在C函数中测试了NULL,它需要C ++对象并在运行中创建它。

好的副作用是您不必将所有C ++方法1:1暴露给Python,您可以调整界面以使其更加Pythonic。在我的包装器中,我在结构中存储了一些额外的信息,以便能够模拟Python列表行为并使数据加载到C ++对象中更有效。