1. 程式人生 > >TypeError: sum() got an unexpected keyword argument 'keepdims'

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-sum-got-an-keepdims-error上找到答案。

注:筆者使用的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’

參考連結