如何编写一个使numpy';s点()使用我的?

如何编写一个使numpy';s点()使用我的?,numpy,Numpy,让numpy的dot()方法使用我的对象的方法的最简单方法是什么 使用scipy.sparse可以轻松演示此问题: 将numpy导入为np 从scipy导入稀疏 A=np.array([[1,2],[3,4]] B=稀疏的.diags([1,2]) BA=B.dot(A)#工作正常 AB=B.u_________(A)#有效:这就是我想要发生的事情 AB=B.T.dot(A.T).T#起作用但不简单 AB=A@B#Python 3.5的首选方式+ AB=A.dot(B)#这是人们所做的,但它给出

让numpy的
dot()
方法使用我的对象的
方法的最简单方法是什么

使用
scipy.sparse
可以轻松演示此问题:

将numpy导入为np
从scipy导入稀疏
A=np.array([[1,2],[3,4]]
B=稀疏的.diags([1,2])
BA=B.dot(A)#工作正常
AB=B.u_________(A)#有效:这就是我想要发生的事情
AB=B.T.dot(A.T).T#起作用但不简单
AB=A@B#Python 3.5的首选方式+
AB=A.dot(B)#这是人们所做的,但它给出了非常不直观的结果
这里需要的结果是
B.。\uu rmatmul\uuu(A)
但我不希望习惯使用
numpy.dot
的用户在合理表达式
A.dot(B)
返回2x2数组时出错,其中每个元素都是稀疏矩阵(B的副本):

>>AB
数组([,,
],
[,
]],dtype=object)
如果我正在编写自己的“稀疏”类,我如何让numpy使用我的objects
\uu\rmatmul\uu
函数?从外观上看,似乎唯一的解决方案可能是将我的对象设为a,但这似乎太复杂了(而且可能仍然失败,因为我怀疑我是否能够提供像访问稀疏数组那样的合理视图)

(我想使用的特定应用程序是数组的自定义稀疏表示,作为二元和,但细节并不重要。)

工具书类 这个问题已经被指出了好几次,结果用
numpy.dot()
的行为来解释,但解决方案都是权宜之计。没有人回答这个问题

遇到此问题的人:

丑陋的变通办法:

  • :就
    numpy
    而言,“类似数组”对象的正式定义,但这似乎要求我的对象表现为密集的数字数组(违背稀疏实现的目的)
  • :子类
    ndarray
    (带警告)
  • :基本上建议
    B.T.dot(A.T).T
(更新)

我认为在Python3.5及以上版本中,显然应该使用符号
A@B
而不是
dot()
。对于python的早期版本,这个问题仍然存在,但与此无关

  • :对于足够大的矩阵,速度不会明显减慢
  • :
  • :建议二维阵列使用
    A@B
    matmul()

问题在于
A.dot
不是操作员。它做了一个简单的np.array(B)
,而不是使用
B.a
或遵从B自己的方法。即使使用
a@B
,也需要讨论一个完整的答案。问题是
a.dot
不是运算符。它做了一个简单的np.array(B)
,而不是使用
B.a
或遵从B自己的方法。即使使用
a@B
,也需要讨论一个完整的答案。