【问题标题】:Numpy's __array_interface__ not returning dictNumpy 的 __array_interface__ 不返回字典
【发布时间】:2013-07-19 19:13:48
【问题描述】:

我正在使用一个外部程序来计算一个用 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 真的很陌生,如果这没有意义或者如果我需要解释任何部分,请告诉我!

【问题讨论】:

  • np.array 想要一本字典。看起来X.__array_interface__() 返回一个字典。那么np.array(X.__array_interface__()) 不会这样做吗?
  • 这也是我最初的想法,但np.array 想要一个带有__array_interface__ 中字典的对象,请参阅http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html。所以np.array(X.__array_interface__()) 只返回字典。不幸的是np.array实际上是shared object,我缺乏操作它的理解。
  • 丑陋但如何分配 X.__array_interface__ = X.__array_interface__() ?如果这失败了,您可能必须深入研究 c++ 并在那一侧构造一个 numpy 数组。

标签: c++ python boost numpy boost-python


【解决方案1】:

__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))

【讨论】:

  • 效果很好!我真的希望有一种方法可以将字典提供给np.array。我会给它几天时间来接受你的回答。 +1
猜你喜欢
  • 2022-06-26
  • 1970-01-01
  • 2014-01-02
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2021-06-20
相关资源
最近更新 更多