如何编写一个使numpy';s点()使用我的?
让numpy的如何编写一个使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)#这是人们所做的,但它给出
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
,也需要讨论一个完整的答案。