numpy中keepdims的理解

作者:千千Sama
原文地址:https://blog.csdn.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

例如对这个矩阵的每一行求和
⎡ ⎣ ⎢ 147258369 ⎤ ⎦ ⎥ [ 123456789 ] [ 1 a m p ; 2 a m p ; 3 4 a m p ; 5 a m p ; 6 7 a m p ; 8 a m p ; 9 ] ⎡⎣⎢147258369⎤⎦⎥[123456789] \left[\begin{matrix}1 &amp;amp; 2 &amp;amp; 3 \\4 &amp;amp; 5 &amp;amp; 6 \\7 &amp;amp; 8 &amp;amp; 9\end{matrix}\right] 147258369[123456789]147amp;2amp;5amp;8amp;3amp;6amp;961524
可以看出,我们是沿着行方向把矩阵元素求和了,所以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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值