I am using an external program to compute a matrix that is written in C++ and is interfaced with python through boost::python
. I would like to pass this C array to numpy, and according to the authors this ability is already implemented with numpy's obj.__array_interface__
. If I call this in a python script and assign the C++ object to X
I obtain the following:
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
From my limited understanding I believe the problem is X.__array_interface__
is not actually returning anything without the ()
. Is there a way to pass these arguments to np.array
explicitly or a workaround for this issue.
I am really quite new to mixing C++ and python, if this makes no sense or if I need to expound on any part let me know!
__array_interface__ should be a property (instance variable), not a method. So in the C++, or wherever the 'sprint.Matrix' object is defined, change it so that instead of having:
print X.__array_interface__
#<bound method Matrix.__array_interface__ of <sprint.Matrix object at 0x107c5c320>>
you have
print X.__array_interface__
#{'shape': (5, 5), 'data': (4416696960, True), 'typestr': '<f8'}
An alternative would be to define a custom wrapper class:
class SprintMatrixWrapper(object):
def __init__(self, sprint_matrix):
self.__array_interface__ = sprint_matrix.__array_interface__()
and then simply do:
numpy.array(SprintMatrixWrapper(X))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With