当前位置: 首页 > news >正文

python concat axis_Python NumPy中sum()函数详解 axis与keepdims图解

目录

numy.sum()函数定义与说明

代码示例、说明及输出

axis = 0 或axis = -3

axis = 1 或 axis = -2

axis = 2或axis = -1

axis = (0, 2)

axis = (0, 2),keepdims=True

总结与扩展

经常使用NumPy的小伙伴会遇到axis与keepdims这两个参数,今天笔者来给大家解剖一下。

以NumPy中sum()函数为例,【】里为笔者翻译与理解。

numy.sum()函数定义与说明

函数定义:sum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue, initial=np._NoValue)

作用:Sum of array elements over a given axis. 【指定轴方向上矩阵元素求和。】

Parameters 参数

----------

axis : None or int or tuple of ints, optional 【可选参数,可以为None, 整数或者整数元组】

Axis or axes along which a sum is performed. 【某个轴或多个轴方向上进行求和运算。】

The default, axis=None, will sum all of the elements of the input array.

【默认情况下,axis=None,会计算输入矩阵 中所有元素的和。】

If axis is negative it counts from the last to the first axis.

【如果axis为负数,则从最后一维开始往第一维计算。后续有说明。】

.. versionadded:: 1.7.0【1.7.0版本新增:】

If axis is a tuple of ints, a sum is performed on all of the axes

specified in the tuple instead of a single axis or all the axes as

before.【如果axis为整数元组,会对该元组指定的所有轴方向上元素进行求和。】

keepdims : bool, optional【布尔类型,可选参数。keepdims是keep dimensions的简写】

If this is set to True, the axes which are reduced are left

in the result as dimensions with size one.

【如果这个参数为True,被删去的维度在结果矩阵中就被设置为一。

举例:如果一个2*3*4的三维矩阵,axis=0,keepdims默认为False,则结果矩阵被降维至3*4(二维矩阵);

如果keepdims=True, 则矩阵维度保持不变,还是三维,只是第零个维度由2变为1,即1*3*4的三维矩阵】

With this option, the result will broadcast correctly against the input array.

【有了这个选项,结果矩阵就可以与原 始输入矩阵进行正确的广播运算。】

If the default value is passed, then `keepdims` will not be

passed through to the `sum` method of sub-classes of

`ndarray`, however any non-default value will be.

【如果设定为默认值,那么keepdims不会传递给ndarray子类的sum方法;但是任何非默认值都会传递。】

If the sub-class' method does not implement `keepdims` any

exceptions will be raised.【如果子类方法未实现keepdims,则将引发异常。】

Returns 返回值

-------

sum_along_axis : ndarray【指定轴方向上的和:ndarray类型】

An array with the same shape as `a`, with the specified axis removed.

【与输入参数'a'一样的shape,只是指定轴被移除了。】

If `a` is a 0-d array, or if `axis` is None, a scalar is returned.

【如果'A`是0维矩阵,或者如果`axis`是None,则返回一个标量】

If an output array is specified, a reference to `out` is returned.

【如果输出矩阵有指定,则返回'out'的引用。】

代码示例、说明及输出

#! /usr/bin/env python

# -*- coding: utf-8 -*-

# import the necessary packages

import numpy as np

a1 = np.arange(24).reshape(2, 3, 4) # 创建一个2*3*6矩阵

print("a1:\n", a1)

以2*3*4的三维矩阵为例,它的shape为(2, 3, 4),axis的值是从零开始的,只能是{0, 1, 2}范围内。

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

下面是笔者的理解方式

axis = i,则矩阵运算沿着第i个下标变化的方向进行操作

axis(正)

0

1

2

从最外层往里剥开计算

shape

2

3

4

axis(负)

-3

-2

-1

从最里层往外剥开计算

axis = 0 或axis = -3

print("np.sum(a1, axis=0):\n", np.sum(a1, axis=0))

print("np.sum(a1, axis=-3):\n", np.sum(a1, axis=-3))

当axis=0时,第零轴被移除(removed),原三维矩阵2*3*4会被降维至3*4二维矩阵。

axis(正)

0

1

2

shape

2

3

4

axis(负)

-3

-2

-1

axis = 0:第零轴维数为2,下标范围为{0,1},这个轴上会有两个数同时相加,具体参考如下表格。

注意红色数字下标。

a[0][0][0]+

a[1][0][0]

a[0][0][1]+

a[1][0][1]

a[0][0][2]+

a[1][0][2]

a[0][0][3]+

a[1][0][3]

a[0][1][0] +

a[1][1][0]

a[0][1][1] +

a[1][1][1]

a[0][1][2] +

a[1][1][2]

a[0][1][3] +

a[1][1][3]

a[0][2][0] +

a[1][2][0]

a[0][2][1] +

a[1][2][1]

a[0][2][2] +

a[1][2][2]

a[0][2][3] +

a[1][2][3]

图片上同样背景色的数字相加求和。

当axis=-3时,求和运算是在倒数第三个轴方向上进行,在此矩阵示例中即为第零轴,二者的计算结果一样。

代码输出结果

np.sum(a1, axis=0):

[[12 14 16 18]

[20 22 24 26]

[28 30 32 34]]

axis = 1 或 axis = -2

print("np.sum(a1, axis=1):\n", np.sum(a1, axis=1))

print("np.sum(a1, axis=-2):\n", np.sum(a1, axis=-2))

当axis=1时,第一轴被移除(removed),原三维矩阵2*3*4会被降维至2*4二维矩阵。

axis(正)

0

1

2

shape

2

3

4

axis(负)

-3

-2

-1

axis = 1:第一轴维数为3,下标范围为{0,1,2},这个轴上会有三个数同时相加,具体参考如下表格。

注意红色数字下标。

a[0][0][0] +

a[0][1][0] +

a[0][2][0]

a[0][0][1] +

a[0][1][1] +

a[0][2][1]

a[0][0][2] +

a[0][1][2] +

a[0][2][2]

a[0][0][3] +

a[0][1][3] +

a[0][2][3]

a[1][0][0] +

a[1][1][0] +

a[1][2][0]

a[1][0][1] +

a[1][1][1] +

a[1][2][1]

a[1][0][2] +

a[1][1][2] +

a[1][2][2]

a[1][0][3] +

a[1][1][3] +

a[1][2][3]

图片上同样背景色的数字相加求和。

当axis=-2时,求和运算是在倒数第二个轴方向上进行,在此矩阵示例中即为第一轴,二者的计算结果一样。

代码输出结果

np.sum(a1, axis=1):

[[12 15 18 21]

[48 51 54 57]]

axis = 2或axis = -1

print("np.sum(a1, axis=2):\n", np.sum(a1, axis=2))

print("np.sum(a1, axis=-1):\n", np.sum(a1, axis=-1))

当axis=2时,第零轴被移除(removed),原三维矩阵2*3*4会被降维至2*3二维矩阵。

axis(正)

0

1

2

shape

2

3

4

axis(负)

-3

-2

-1

axis = 2:第二轴维数为4,下标范围为{0,1,2, 3},这个轴上会有四个数同时相加,具体参考如下表格。

注意红色数字下标。

a[0][0][0] +

a[0][0][1] +

a[0][0][2] +

a[0][0][3]

a[0][1][0] +

a[0][1][1] +

a[0][1][2] +

a[0][1][3]

a[0][2][0] +

a[0][2][1] +

a[0][2][2] +

a[0][2][3]

a[1][0][0] +

a[1][0][1] +

a[1][0][2] +

a[1][0][3]

a[1][1][0] +

a[1][1][1] +

a[1][1][2] +

a[1][1][3]

a[1][2][0] +

a[1][2][1] +

a[1][2][2] +

a[1][2][3]

图片上同样背景色的数字相加求和。

当axis=-1时,求和运算是在倒数第一个轴方向上进行,在此矩阵示例中即为第二轴,二者的计算结果一样。

代码输出结果

np.sum(a1, axis=2):

[[ 6 22 38]

[54 70 86]]

axis = (0, 2)

print("np.sum(a1, axis=(0,2)):\n", np.sum(a1, axis=(0,2)))

print("np.sum(a1, axis=(-3,-1)):\n", np.sum(a1, axis=(-3,-1))) # axis=(-1,-3) 这样写也可以

当axis=(0, 2)时,第零轴和第二轴都被移除(removed),原矩阵2*3*4会被降维成只有3个元素的一维矩阵,shape为(3,)。

axis(正)

0

1

2

shape

2

3

4

axis(负)

-3

-2

-1

axis=(0, 2):第零轴维数为2,下标范围为{0,1};第二轴维数为4,下标范围为{0,1,2,3}。会有2*4=8个数同时相加。

图片上同样背景色的数字相加求和。

代码输出结果

指定的第零轴和第二轴被移除,输出结果矩阵被降维,变成一维矩阵,里面有三个元素。

np.sum(a1, axis=(0,2)):

[ 60  92 124]

axis = (0, 1)与axis = (1, 2)的情况大家自行实验。

以上所有代码都是在keepdims=False的情况下。下面看一下keepdims=True的例子。

axis = (0, 2),keepdims=True

print("np.sum(a1, axis=(0,2),keepdims=True):\n", np.sum(a1, axis=(0,2),keepdims=True))

【如果keepdims这个参数为True,被删去的维度在结果矩阵中就被设置为一。

举例:如果一个2*3*4的三维矩阵,axis=0,keepdims默认为False,则结果矩阵被降维至3*4(二维矩阵);

如果keepdims=True, 则矩阵维度保持不变,还是三维,只是第零个维度由2变为1,即1*3*4的三维矩阵】

With this option, the result will broadcast correctly against the input array.

【有了这个选项,结果矩阵就可以与原始输入矩阵进行正确的广播运算。】

axis(正)

0

1

2

shape

2

3

4

axis(负)

-3

-2

-1

原理参考上面的笔者翻译,输出结果还是三维矩阵,只是指定的第零轴和第二轴全部变为一维了,即shape为1*3*1。

这样做的目的是方便后续与原始矩阵的广播运算(加减乘除等)。

代码输出结果

np.sum(a1, axis=(0,2),keepdims=True):

[[[ 60]

[ 92]

[124]]]

如果觉得这种理解困难,可以参考其他博客上介绍的方法:

《Python之NumPy(axis=0/1/2...)的透彻理解》

总结与扩展

NumPy中的mean(), average(), all(), any(), concat()等函数中的axis参数与sum()函数原理一样。

带有axis参数的常用函数请参考下面表格。

TensorFlow concat()的axis参数 与 PyTorch中cat()的dim参数也与sum()函数的axis参数一样的原理。

关于numpy.all()与any()可以参考另外一篇博客《Python NumPy.all()与any()函数理解》。

函数名

作用

mean

求平均值

average

求加权平均值

std

求标准差

var

求方差

min, max

求最小值,求最大值

prod

计算所有元素的乘积

all

判断所有元素是否都为True

any

判断是否有元素为True

concat

矩阵拼接

sort

给矩阵排序

argsort

排序后的矩阵中各元素在原始输入矩阵中的索引位置

argmax

求最大值在原始输入矩阵中的索引位置

相关文章:

  • python echarts mysql_Django中从mysql数据库中获取数据传到echarts方式
  • skywalking原理_链路追踪 SkyWalking 源码分析——Collector Naming Server 命名服务
  • python print 调试_python 调试: print / assert / logging / pdb
  • 信息系统项目管理师论文_高级软考信息系统项目管理师考试技巧之论文摘要
  • imp oracle reschema_Oracle数据库逻辑备份之exp/imp(一)
  • aspnet是前端还是后端_谁能解释一下“前端开发”与“.NET”有什么区别和联系...
  • oracle rank 语法_Oracle用于排名的函数
  • extjs string类型转date_Extjs 时间格式的转换
  • jmeter如何定位网络延时_JMeter如何模拟不同的网络速度
  • docker mariadb集群_Docker Swarm 部署Mysql/Mariadb高可用主从复制集群
  • seaborn无法import_seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决...
  • python中文件最重要的功能陶瓷材料_2020大学慕课新型陶瓷材料及商业应用期末考试查题公众号答案...
  • python的notebook怎么打开_ipython notebook 如何打开.ipynb文件?
  • 如何区分电梯卡为id卡ic卡_怎么看小区门禁卡是ic还是id
  • fusionsphere读音_【转载】FusionSphere架构详解
  • Bytom交易说明(账户管理模式)
  • js学习笔记
  • leetcode-27. Remove Element
  • Odoo domain写法及运用
  • python 学习笔记 - Queue Pipes,进程间通讯
  • rabbitmq延迟消息示例
  • Wamp集成环境 添加PHP的新版本
  • windows下使用nginx调试简介
  • 阿里云Kubernetes容器服务上体验Knative
  • 安卓应用性能调试和优化经验分享
  • 多线程 start 和 run 方法到底有什么区别?
  • 给初学者:JavaScript 中数组操作注意点
  • 日剧·日综资源集合(建议收藏)
  • 探索 JS 中的模块化
  • 应用生命周期终极 DevOps 工具包
  • kubernetes资源对象--ingress
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • # 达梦数据库知识点
  • $GOPATH/go.mod exists but should not goland
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (七)glDrawArry绘制
  • (七)理解angular中的module和injector,即依赖注入
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (四)汇编语言——简单程序
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一) storm的集群安装与配置
  • (转)linux 命令大全
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ******之网络***——物理***
  • .“空心村”成因分析及解决对策122344
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • @Bean, @Component, @Configuration简析
  • [20160807][系统设计的三次迭代]
  • [20190113]四校联考
  • [AX]AX2012开发新特性-禁止表或者表字段