numpy中keepdims的理解

本文深入解析Numpy中数组维度的概念,通过实例演示如何正确理解与运用维度属性,特别是针对keepdims参数的使用场景,帮助读者掌握矩阵操作中的维度保持技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

<think>好的,用户想了解NumPy中mean函数的使用方法和示例。首先我需要回忆一下mean函数的基本功能,它是用来计算数组的平均值的。用户可能想知道如何调用这个函数,以及有哪些参数可以调整。 根据提供的引用内容,特别是引用[2],里面详细讲解了numpy.mean的API,包括函数签名、返回值和示例。比如,函数的基本用法是numpy.mean(arr, axis=None),其中axis参数控制沿着哪个轴计算平均值。还有keepdims参数可以保持维度,以及where参数进行条件平均。 接下来,我需要整理这些信息,分步骤说明。首先介绍函数的基本语法,然后解释各个参数的作用,如axis、dtype、keepdims和where。每个参数都要给出示例,这样用户更容易理解。 用户可能还会关心多维数组的情况,比如如何沿特定轴计算平均值,这时候axis参数的取值就很重要。例如,二维数组中axis=0是按列计算,axis=1是按行计算。需要确保示例代码清晰展示这一点。 另外,引用中提到条件平均,使用where参数筛选元素。这部分可能需要用布尔数组来演示,比如计算大于某个值的元素的平均值。需要确保示例中的where参数应用正确。 还要注意保持回答结构清晰,按照基本用法、参数详解、示例的顺序来组织内容。同时,根据用户提供的引用,确保引用的正确性,比如在讲到where参数时添加引用标识[^2]。 最后,生成相关问题时要围绕mean函数的相关知识点,比如性能优化、多维数组处理、条件平均等,帮助用户进一步探索。</think>### NumPy中mean函数的详细使用指南 `numpy.mean`是用于计算数组平均值的核心函数,支持多维数组计算和多种参数配置。以下是分步说明: #### 1. 函数语法 ```python numpy.mean(arr, axis=None, dtype=None, keepdims=False, where=True) ``` - **arr**: 输入数组(必选) - **axis**: 计算轴方向(可选,默认全局平均) - **dtype**: 输出数据类型(可选) - **keepdims**: 是否保持维度(布尔值) - **where**: 条件筛选(布尔数组) #### 2. 参数详解 - **axis**控制计算维度: - 二维数组中`axis=0`计算列平均,`axis=1`计算行平均[^2] - 三维数组中`axis=(0,1)`计算前两维平均 - **keepdims=True**时保留原数组维度(例如将计算结果保持为列向量) - **where**参数支持布尔掩码筛选有效数据[^2] #### 3. 基础示例 **一维数组计算**: ```python import numpy as np arr = np.array([1,2,3,4]) print(np.mean(arr)) # 输出 2.5 ``` **二维数组按轴计算**: ```python matrix = np.array([[1,2],[3,4]]) print(np.mean(matrix, axis=0)) # 输出 [2. 3.](列平均) print(np.mean(matrix, axis=1)) # 输出 [1.5 3.5](行平均) ``` **条件筛选计算**: ```python data = np.array([5,10,15,20]) mask = data > 10 print(np.mean(data, where=mask)) # 输出 (15+20)/2=17.5 [^2] ``` #### 4. 高级用法 **保持维度特性**: ```python result = np.mean(matrix, axis=1, keepdims=True) print(result.shape) # 输出 (2,1)(原始维度结构保留) ``` **指定输出类型**: ```python print(np.mean([1,2,3], dtype=np.int32)) # 输出 2(强制转换为整型) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值