我正在使用外部程序来计算用C ++编写的矩阵,并通过boost::python
与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,如果这没有意义,或者我需要解释任何部分让我知道!
答案 0 :(得分: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))