6

我正在使用一个外部程序来计算一个用 C++ 编写并通过boost::python. 我想将这个 C 数组传递给 numpy,根据作者的说法,这种能力已经用 numpy 实现了obj.__array_interface__。如果我在 python 脚本中调用它并将 C++ 对象分配给X我将获得以下内容:

print X
#<sprint.Matrix object at 0x107c5c320>

print X.__array_interface__
#<bound method Matrix.__array_interface__ of <sprint.Matrix object at 0x107c5c320>>

print X.__array_interface__()
#{'shape': (5, 5), 'data': (4416696960, True), 'typestr': '<f8'}

print np.array(X)
#Traceback (most recent call last):
#  File "<string>", line 96, in <module>
#ValueError: Invalid __array_interface__ value, must be a dict

根据我有限的理解,我认为问题在于X.__array_interface__没有(). 有没有办法将这些参数np.array显式传递给此问题或解决此问题。

我对混合 C++ 和 python 真的很陌生,如果这没有意义或者我需要解释任何部分,请告诉我!

4

1 回答 1

2

__array_interface__ 应该是属性(实例变量),而不是方法。所以在 C++ 中,或者在任何定义了 'sprint.Matrix' 对象的地方,改变它,而不是:

print X.__array_interface__
#<bound method Matrix.__array_interface__ of <sprint.Matrix object at 0x107c5c320>>

你有

print X.__array_interface__
#{'shape': (5, 5), 'data': (4416696960, True), 'typestr': '<f8'}

另一种方法是定义一个自定义包装类:

class SprintMatrixWrapper(object):
    def __init__(self, sprint_matrix):
        self.__array_interface__ = sprint_matrix.__array_interface__()

然后简单地做:

numpy.array(SprintMatrixWrapper(X))
于 2013-07-24T18:29:59.727 回答