這個錯誤是筆者試圖使用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’
https://stackoverflow.com/questions/46420007/numpy-sum-got-an-keepdims-error