在python 3.5中,引入了@
運算符進行矩陣乘法運算,跟在PEP465後面。這是通過例如在numpy作爲matmul operator。使矩陣乘法運算符@爲numpy中的標量運算
然而,由於提出的PEP,當一個標量操作數稱爲numpy的運營商拋出異常:
>>> import numpy as np
>>> np.array([[1,2],[3,4]]) @ np.array([[1,2],[3,4]]) # works
array([[ 7, 10],
[15, 22]])
>>> 1 @ 2 # doesn't work
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unsupported operand type(s) for @: 'int' and 'int'
這對我來說是一個真正的關斷,因爲我實現數字信號處理算法應該適用於標量和矩陣。這兩種情況下的方程式在數學上完全等價,這並不奇怪,因爲「1-D x 1-D矩陣乘法」等價於標量乘法。然而,目前的狀態迫使我編寫重複的代碼,以便正確處理這兩種情況。
因此,鑑於目前的狀態並不令人滿意,是否有任何合理的方法可以使@
運營商適用於標量?我想過爲標量數據類型添加一個自定義的__matmul__(self, other)
方法,但考慮到涉及的內部數據類型的數量,這似乎很麻煩。我是否可以將numpy數組數據類型的__matmul__
方法的實現更改爲不引發1x1數組操作數的異常?
而且,在這個設計決策背後的理由是什麼?從我的頭頂來看,我想不出有什麼令人信服的理由不要爲標量實現這個操作符。
'[1] @ [2]'怎麼樣?標量已經有'*'爲什麼要複製它。 – furas
聽起來像真正的問題是你的代碼有時會返回標量,有時會返回矩陣。爲什麼不重構,以便您的代碼返回1 x 1矩陣而不是標量?或者編寫一個快速函數,該函數採用矩陣或標量並返回該矩陣或帶有標量的1x1矩陣 –
爲什麼不能使用try - except例程? – Jalo