TypeError: sum() got an unexpected keyword argument 'keepdims'
TypeError: sum got an unexpected keyword argument 'keepdims'
前言
這個錯誤是筆者試圖使用np.sum(…, keepdims=True)對np.matrix型別的變數求和時所發生的錯誤(程式碼如下)。
import numpy as np
a = np.matrix(np.arange(15).reshape(-1,5))
print(np.sum(a, axis=1, keepdims=True))
筆者首先想到的是自己是否將關鍵字keepdims打錯,因此使用help(np.sum)來檢查,但發現keepdims確實是np.sum的一個引數名稱。後來只得上網尋找解決辧法,最後在stackoverflow上的某條問答
注:筆者使用的numpy版本是1.14.3
發生原因
根據該問答的解釋,sum這個函式是由np.ndarray的各子類別來實作的,因此如果某個子類別在sum函式中並未實作keepdims引數,就會發生錯誤。
首先使用內建函式issubclass檢查np.matrix是否為np.ndarray之子類別:
issubclass(np.matrix, np.ndarray) #True
確認np.matrix是np.ndarray的子類別後,去numpy.matrix.sum檢視該函式接受的引數,可以發現np.matrix的sum函式並不支援keepdims這個引數。
至於為什麼np.matrix的sum函式不實作keepdims這個引數呢?以下是回答者給出的解釋: np.matrix只能是二維的,因此在對np.matrix使用np.sum(…, axis=0)時,其輸出預設也仍是二維的。所以keepdims對於np.matrix就如同雞肋一般,是發揮不了任何作用的。
解決辦法
解決辦法很簡單,在對np.matrix求和時不要加keepdims=xxx
就行了。
完整錯誤訊息
Traceback (most recent call last):
File “”, line 4, in print(np.sum(a, axis=1, keepdims=True))
File “/anaconda3/lib/python3.6/site-packages/numpy/core/fromnumeric.py”, line 1880, in sum return sum(axis=axis, dtype=dtype, out=out, **kwargs)
TypeError: sum() got an unexpected keyword argument ‘keepdims’