准备:
开始将轴之前先给大家讲下np.reshape() 函数
numpy.reshape() 函数是numpy 中用于改变数组形状(维度)或大小的函数,你可以给它传入一个元组,它会帮你想成新的形状的数组。 重要一点是,传入数组元素相乘的积必须等于数组集合元素的个数 。
numpy.reshape(xxx) 函数接受一个元组, 这个元组用来表示数组集合的轴方向以及隐含维度。
我先讲下,我对这些专有名词的理解:
数组形状:描述这个数组的样式,详细点说: 是一个多维数组在各个维度上元素数量的元组。它定义了数组的数据结构,即有多少行、多少列以及在更高维度中如何组织数据。
元组:是Python中一种数据结构,单位元素之间用逗号分隔,可以包含用来存储任何类型的数据,但是其中的元素内容不可以改变,即无法添加 删除 修改
示例: (2,3,4,)
传入数组元素相乘的积必须等于数组集合元素的个数:
下面这是一个 2 x 2 x 3 的三维数组
其中 (2 x 2 x 3) 就是我在前面提到的,数组形状,这个数组积是 12 , 而数组共有12个元素,说白了 向reshape() 函数传入的这个元组 定义这个数组的形状,它应有多少行多少列,行和列组成了表格,存在多少个表格。
示例代码:
# 环境: python 3.9 版本无所谓,一般不会涉及这么细致,只要是3.0往上的大版本
# jupyter notebook :轻量级交互式科学计算的笔记本
a = [1,2,3,4,5,6,7,8,9,10,11,12]
array = np.array(a)
array.reshape(2,2,3)
我给大家看一个图大家就明白三维数组的维度是怎么回事了,到时候对它做索引 切片 转换,就明白了,它为什么成为这个样子。
上述示例图表现了一个 (3,2,3)的三维数组,这个三维数组包含了三个二维数组,其中一个二维数组包含了两个一维数组,我们可以这样理解 : 一维数组只包含行,二维数组包含行和列,三维数组是包含行 和列 和 深度。 一维 二维数组 大家很容易理解,看二维表就很容易理解:
三维数组的这个深度,我们可以这样想深度就想象成垒砖,而这个砖呢? 就是每一个二维表。
三维数组就是将每一个二维数组垒起来,产生立体感。
二维表的行很容易理解,而列也不好理解, 因为它是这样的一个样式:
最外层的中括号影响大家和我的理解,它为什么是这样一个样式,大家不用管它只看离数据最近的这个括号和数据。
不知道大家理解我上面说的没有。 下面我说多维数组的轴,以三维为例我的能力目前就在三维,四维是怎样的抽象空间我也想不明白。
切片: 三维数组就是一个长方体,或者立方体 ,你像香肠一样,从中切出一片,这一片就是切片。
axis
(轴):
axis
(轴) 用于定义多维数组的轴或维度。
axis = 0 表示数组最外层的维度 如果以三维数组为例 它就是 深度
axis = 1 表示在每个二维矩阵中 沿着行的方向
axis = 2 表示在每个二维矩阵(切片) 中沿着列的方向
以上这样思想对于理解:这样一个二维矩阵比较有用,我待会换一个就不好用了。
[[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]]我们用shape 函数查看下这个数组的形状
其中 axis = 0 表示第1个维度 表示在 (2,2,3)中 控制着第一个元素 2 的位置,axis= 1 表示第二个维度, 控制着第二个元素 2 的位置变化, axis = 3 表示第三个维度 控制着元素3 的位置变化。 (2,2,3) 中的元素只是表示在每个方向大小或者多少, 我现在说是这个这个元素的占位也就是位置。还有这个占位代表这那个方向。
我们来看下难度更大的三维数组:
[[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]],
[[13, 14, 15], [16, 17, 18]]]
这是一个 3 x 2 x 3 的三维数组 。
那它们之间的区别呢? (2,2,3) (3,2,3),显然是 (3,2,3)比 (2,2,3) 多个一层,怎么理解: 以 (3,2,3) 为例 ,首先我们一看,奥这个表示数组形状的元组,共有三个元素,那就是表示 三维数组, 从里面详细看, 这个数组形状中的第一个元素 3 ,向大家说明了,奥 我这个三维数组有三个二维数组,这个数组形状中的第二个元素 2 向大家说明了,奥 我这个三维数组中的二维数组,包含了两个一维度数组,这个数组形状中的第三个元素 3, 向大家说明了这个三维数组,中的二维数组,中的一维数组中,共有三列。
如何区分数组个数:(以下图数组为例)
区分数组个数, 面对多维数组我们要从最里层,最小维数组去看, 例如上图是一个三维数组, 最小维度数组应该是一维数组,一位数组长什么样子
[ 1, 2, 3] 类似 python中的列表,这个一维数组共有三列
再去次最小维数组去看(紧贴着一维数组的外层)
这个 紧贴着一维数组的外层的括号,包含了 两个一维数组
再去次次最小维数组去看,近贴着二维数组中括号的外层
这个 紧贴着二维数组的外层的括号,包含了 两个二维数组 :
如何作区分根据中括号的数量来作区分,它是几位数组,最外层就有几个括号如果是三位数数组,最外层肯定有三个中括号, 那这个三维数组中有几个二维数组,还是看括号,它的最外层有两个中括号,我们看这个三维数组中的有两个中括号括起来的。
sum 函数 加深我们对多维数组轴方向的理解:
在 numpy 中 , 以三维数组为例,numpy.sum.()函数可以用对数组沿着指定轴进行求和操作, 例如有一个三维数组 A ,形状是(x,y,z) , 你可以通过设置 axis 参数来控制求和的方向。
我们拿个有难度三维数组玩:
A = np.array([[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]],
[[13, 14, 15], [16, 17, 18]]])
sum函数沿着数组指定的轴进行加法求和, axis 用于指定轴方向 axis = 0 是沿着纵深 也就是切片、层,每个层相对应的元素计算:
给大家上图:
这下明白我说的垒砖了吧。
axis = 1 axis = 2 ,我没有办法理解: 我在网上copy的大家可以看看
在NumPy中,对三维数组(或者其他多维数组)使用 numpy.sum() 函数并设置 axis=1 参数时,将会沿着第二个维度进行求和操作。对于一个三维数组 A,其形状为 (x, y, z):
import numpy as np
# 假设有一个三维数组
A = np.array([[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]],
[[13, 14, 15], [16, 17, 18]]])
# 沿着第二个维度(y轴)求和
sum_axis_1 = np.sum(A, axis=1)
# 这将得到一个新的二维数组,形状为 (x, z)
# 每一行的元素是原数组对应行(同一 x 下)的所有列(y)的元素之和
在这个例子中,sum_axis_1 数组的结果将是:
code
array([[[ 5, 7, 9],
[17, 19, 21]],
[[29, 31, 33],
[41, 43, 45]]])
这里每一行 [...,...] 是原数组某一层(x坐标不变)所有列(y坐标变化)的元素之和。
非常感谢各位同僚网友的支持,小马一如既往会将自己所学,深入理解后的一切分享给大家
祝愿大家在新的征途上走的更远更高
送大家一些古语:
余幼时即嗜(shì)学。家贫,无从致书以观,每假借于藏书之家,手自笔录,计日以还。天大寒,砚冰坚,手指不可屈伸,弗之怠(dài) -- 送东阳马生序
我年幼时就爱学习。因为家中贫穷,无法得到书来看,常向藏书的人家求借,亲手抄录,约定日期送还。