Numpy中ndarray到底有什么秘密?

现在我们已经对 NumPy 有了基本的认识,知道了 NumPy 的强大,并且得知 NumPy 核心就是利用多维数组对数据的高效处理方法

但是你是否思考过什么是数组呢?只有了解到什么是数组,才能理解它可以解决什么问题,进而在遇到该类问题时快速选择使用它。我们还应该注意到多维这个概念,正如楼房有多层一样,数组有多维。分清楼房的多层可以帮助我们不会走错家门,而理清数组的多维同样可以帮助我们更好地组织数组、操作数组、查找数据。

每个事物都存在着属性,我们在使用这个事物时其实是针对属性进行使用的,为了更好地使用数组,使数组能够帮助我们解决具体的问题,我们还应该了解数组的属性。例如我们食用苹果,是针对它的饱腹、营养、味甜的属性,挑选苹果时则依赖色红、个圆等属性。

这些问题或许你比较模糊,不用着急,今天我们就会对这些问题进行讲解。

维度、属性与轴

维度是用来描述事物所在的空间维度。在不同领域,维度有着不同的含义。例如,在物理学中的三维空间有长度、宽度和高度三个维度;在数学中,点是零维,线是一维,平面是二维,立方体就是三维。在计算机领域中,可以用三维来表示一个人的属性,如身高、肤色和体重,每个属性对应一个维度。

从数组上讲,维度就是数的组合叠加,将任意个数字组合在一起我们称为一维数组,将任意个一维数组组合在一起我们称为二维数组,这样将当前维度数组视作一个单位元素去堆叠就生成了高一维的数组。  

而轴就是用来描述多维数组中的数据位置的一组直线,每一个维度对应一个轴。 轴与数组的维度相关联,通过不同的轴,我们可以访问数组中不同维度的数据。

  在一维空间中,我们用一个轴(通常为axis 0)表示直线空间上的离散点。 在二维空间中,需要用两个轴(通常为axis 0和axis 1)来表示平面空间上的离散点,其中axis 0表示行,axis 1表示列。 在三维空间中,需要用三个轴(通常为axis 0、axis 1和axis 2)来表示立方体空间上的离散点。

这里需要注意,axis0通常指向最新的维度,比如三维相比二维增加了高,那么axis0就是高这个维度的轴,其他以此类推。

通过指定多个不同的轴,我们可以在多维数组中定位和处理数据。

image.png

属性是描述事物特征或性质的概念。在不同领域,属性可以表示不同事物的特征。例如,在计算机领域中,我们要识别合适的礼仪队员,对人进行建模。人的肤色、身高和体重就是三个不同的属性。我们可以用一个维度的数据组织形式来表达这三个属性的数据集,也可以用关系型数据库来存储这三个属性和属性值。在数学和计算机科学中,属性类似于数据的特征,可以用于描述数据集合的性质和特点。

举个例子,有一个二维数组(矩阵):

 

[[1, 2, 3],  [4, 5, 6],  [7, 8, 9]]

这个数组有两个维度,可以视为平面空间上的数据。在numpy中,我们通常用axis 0和axis 1来表示这两个维度。axis 0表示行,axis 1表示列。属性可以类比为矩阵中的元素,每个元素都代表矩阵中的一个数据点,而这个数据点可以用于描述矩阵的性质和特征。例如,矩阵中的元素可以表示一个人的某个属性值,如肤色、身高或体重。

通过理解维度、轴和属性的概念,我们可以更好地处理多维数组数据、描述事物特征以及进行数学和科学计算。这些概念在数据处理、人工智能、数学建模等领域中都起着重要的作用。

什么是数组?

数组是一系列具有相同数据类型的元素组合,并且还是有次序的。换句话来讲,数组就是一组数据元素,并且这些元素的数据类型都是相同的。我们可以用工厂流水线来比作数组,流水线中的产品就是数据元素,它们有着相同的类型且是连续的。

很多人学习的第一门编程语言就是 C 语言,不是说 C 语言很简单,而是 C 语言更偏向于底层。通过对 C 语言的学习,能够深刻地了解到数据在内存中的存储方式,所以使用 C 语言来诠释数组在内存中如何存储和调用是非常直观的。接下来我们利用它来创建数组,诠释数组的本质和特点。

C 语言创建数组比较简单,如下示例代码,将一个学生的六科成绩作为一个数组进行创建,并将其打印输出。

 

c

#include <stdio.h> #include <stdlib.h> int main(){ int grade[6]={100,106,100,83,67,78}; for(int i=0;i<6;i++){ printf("成绩%d:%d",i,grade[i]); } return 0; }

结果如下:

 

成绩0:100 成绩1:106 成绩2:100 成绩3:83 成绩4:67 成绩5:78

C 语言创建数组是通过定义创建的,但仅仅明白如何创建数组是不够的,更重要的是我们还需要知道数组在内存中是如何存放的。我们访问数组元素是通过下标进行访问的,这是很常见的形式,但是下标访问的依据是什么呢?我们通过查看数组在内存中的地址来进行解释,看以下代码:

 

c

#include <stdio.h> #include <stdlib.h> int main(){ int grade[6]={100,106,100,83,67,78}; for(int i=0;i<6;i++){ printf("成绩%d:%d\n",i,grade[i]); } for(int i=0;i<6;i++){ printf("地址%d:%x\n",i,&grade[i]); } return 0; }

结果如下:

 

成绩0:100 成绩1:106 成绩2:100 成绩3:83 成绩4:67 成绩5:78 地址0:251df8e8 地址1:251df8ec 地址2:251df8f0 地址3:251df8f4 地址4:251df8f8 地址5:251df8fc

从打印的地址结果来看,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值