numpy中keepdims的理解
作者:千千Sama
原文地址:https://blog.****.net/lllxxq141592654/article/details/83011056
预备知识——准确理解numpy中数组的维度
请看下面的问题
Q1:
我们数学中的向量是如何在numpy中表示的?例如A=[1,2,3]
A: B:
[[1 2 3]] [1 2 3]
- 1
- 2
答案:A
Q2:
numpy中的[1 2 3]
的维度是多少?
A: B:
(3,1) (3,)
- 1
- 2
答案:B
Q3:
你能够准确写出维度为(2,3,4)
的numpy矩阵吗?(元素任意)
答案:
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[13 14 15 16]
[17 18 19 20]
[21 22 23 24]]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
如果你能够正确回答以上问题,那么可以直接进入正文。
如果不能,请参见numpy中维度的正确理解姿势
keepdims
根据预备知识,我们达成几个共识
-
维度:矩阵的维度用一个元组(tuple)表示,如
(3,),(2,3),(2,3,4)
-
维数:元组的元素个数即矩阵的维数,如
(3,),(2,3),(2,3,4)
对应的矩阵维数分别是1,2,3. -
矩阵的轴(axis):矩阵的轴与维度对应,维度的第一个元素代表的轴是axis=0,第二个元素代表的轴是axis=1.如维度为
(2,3,4)
的矩阵axis=0即为2
代表的维;再如数学中的2×3矩阵(即维度为(2,3)
)axis=0即为列(列方向),axis=1即为行(行方向)。
作为引子,我们来看一个numpy.sum求和函数
官网手册的用法是
numpy.sum(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globals._NoValue>)
- 1
例如对这个矩阵的每一行求和
⎣⎡61524⎦⎤
可以看出,我们是沿着行方向把矩阵元素求和了,所以axis=1,但是如果只用axis=1这个参数,会出现问题,请看
import numpy as np
a=np.arange(1,10).reshape(3,3)
print(a)
print(np.sum(a,axis=1))
- 1
- 2
- 3
- 4
[[1 2 3]
[4 5 6]
[7 8 9]]
[ 6 15 24]
- 1
- 2
- 3
- 4
发现问题了吗?结果应该是一个(3,1)的列向量
[[ 6]
[15]
[24]]
- 1
- 2
- 3
但是结果是
[ 6 15 24]
- 1
这样一个(3,)
矩阵。元素正确,但是维度错了。
这是因为仅仅定义axis=0的numpy求和,和数学中的求和是不一样的!仅仅指定axis,numpy.sum会沿着这个维度求和没错,但是同时也把这个维度消灭了!.维度被消灭了,所以结果少了一维。
那么正确方式是什么呢?——添加keepdims=True
这个参数
我们先来看结果
import numpy as np
a=np.arange(1,10).reshape(3,3)
print(a)
print(np.sum(a,axis=1,keepdims=True))
- 1
- 2
- 3
- 4
[[1 2 3]
[4 5 6]
[7 8 9]]
[[ 6]
[15]
[24]]
- 1
- 2
- 3
- 4
- 5
- 6
喏,好使了。解释一下keepdims=True
这个参数的意思
从字面上看keepdims就是保持维数的意思,其实它的功能也确实跟他的名字一样这么直白——保持矩阵维数不变。以前是(3,3)
2维,现在是(3,1)
2维。因为对axis=1进行了求和,所以它的长度从3变成了1.
我们来看下官网手册对该参数的描述
框框中的话是——如果该参数设置为True,那么被减少的那个轴会以维度1保留在结果中
。
翻译到这已经很直白了,希望大家能够理解。
总结
对axis进行指定轴操作会使矩阵降维,使用keepdims=True
会使消失的轴保留,并保持维度为1。
老鸟请直接看总结