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’

參考連結

https://stackoverflow.com/questions/46420007/numpy-sum-got-an-keepdims-error

你可能感兴趣的:(Python學習筆記)