在上一篇《手把手陪您学Python》46——NumPy介绍中,我们了解了NumPy的开发历史和以数组计算为核心的主要特点。
今天,我们将对NumPy的数组对象——ndarray进行具体的介绍,这不仅仅是NumPy的基础,更是我们今后学习和使用Python进行数据分析的基石以及重中之重。
1、理解多维数组
数组是一系列有序的元素的集合。对于低维数组,我们很容易理解。在入门阶段,我们学习过列表、词典、元组、集合等Python数据结构,无论从形式上还是实质上,我们看到的这些对象都只有一行数据,或者说都只有一个维度。这一行数据就是一维数组。如果用图形表示,就是一条直线。
如果在行的方向和列的方向都有数据,我们就可以称之为二维数组。我们常见的Excel表格就是二维的,其中的数据就组成了二维数组。如果用图形表示就是一个平面。
对于一维和二维来说,无论是图形还是数据,都是我们可以看得见摸得着的。但是到了三维,我们只看得到具有长宽高属性的三维图形。而在数据层面,由于我们的显示设备是二维的,即使是三维数据,也是我们肉眼不可见的。
当然,如果某一天,我们有了“立体”显示器,或者Excel可以像3D软件一样,能够在3个维度上进行数据处理,也许那时,三维数据的可视化就实现了。
但是目前,对于三维数据的处理,只能通过建立“组”的方式,将三维数据转化成二维数据进行展示和数据处理。
对于更高的维度,无论图形还是数据,都是不可见的“结构”,只能靠想象去“理解”了。
如果要处理更高维度的数据,可以参考三维数据转化为二维数据处理的方式,通过建立更多的“组”或者“类”,将高维数据转化为二维数据再进行处理。
虽然这样的方式确实能够对多维数据进行处理,还可以将不可视的多维数据转化为可视的二维数据,在Excel实操中我们也常常这样做,但从计算效率角度来看就会差一些了。无论是对于维度较多的数据,还是需要对所有维度数据都进行计算,或者更为复杂的计算,不仅会在Excel中形成超大的表格,降低可读性,操作起来也非常的繁琐,计算耗时也是一个需要考虑的问题。
这时,就需要NumPy的多维数组——ndarray出场了。
2、ndarray
能够对多维数组直接进行数据的处理和运算是NumPy的核心特征。ndarray就是NumPy中多维数组的对象名称。
在后面的讲解中,我们可能会经常用到“数组”“NumPy数组”“多维数组”“ndarray”“ndarray数组”等名称,说的都是一回事,就是NumPy的ndarray对象。为了避免后面对于名称的混淆,在这里提前说明一下。
ndarray作为多维数组,是Python中一种快速、灵活的大型数据容器,能够在更多维度的层面,对容器中的所有数据进行数学计算。
对于上面提到的多维数组的处理,如果使用ndarray就简单得多了,无论是多少维的数据,对Python来说就是一个ndarray对象,那么处理多维数据的就可以像我们处理一维或者二维数据一样简单了。甚至可以说就像做加减法一样简单,因为一个ndarray对象,就是一个加数或者减数,可以直接进行运算。
举个例子,假设需要对某一个以米为单位的4维数组进行单位换算,将其所有数据都改为厘米为单位。且不说这样乘100的计算复不复杂,就是将这4维数据都展示在Excel中,就是一个浩大的工作量,而这还仅仅是4维。
而对于ndarray来说就容易得多了。假设这个数组的名称是arr,那么我们只需要列公式arr*100就能够得到结果了。
下面我们简单的演示一下,对于其中不理解的地方可以先不用理会,我们下一篇就都会讲到了。
In [1]: import numpy as np
In [2]: arr = np.random.randn(3, 3, 3, 3) # 生成每个维度都有3个数据的4维随机数组
arr
Out[2]: array([[[[ 0.34070499, -0.07749458, -0.80897244],
[ 0.17306047, 0.22073438, -1.82253543],
[-1.4620558 , -0.25053901, -2.74696491]],
[[ 0.20451262, 0.31355189, -0.16368655],
[ 0.06822595, 0.59843459, 0.16753618],
[-0.10917227, -1.30625812, -0.1301852 ]],
[[-0.59890723, -0.12580842, 0.0089189 ],
[ 0.97450803, 0.09271124, 0.3900785 ],
[-0.65855893, 0.12621535, 1.37550345]]],
[[[ 0.72476598, -0.73245741, 1.50135446],
[ 0.37253324, 0.08650926, 0.92751319],
[-2.07342038, -0.69226857, 0.98638266]],
[[ 0.68834606, -0.26470489, -0.51556124],
[ 1.35501111, -1.16790166, 1.09749603],
[ 1.24249061, 0.77816968, -0.44983675]],
[[ 0.8423788 , -0.37800401, -1.39055683],
[ 0.59271881, 1.34775045, 1.10454984],
[-0.2878918 , 0.26215962, -0.29740089]]],
[[[-0.06205315, -1.02511302, 1.19580917],
[ 1.74062933, -0.62468539, 0.22947125],
[ 0.43298645, -0.1484861 , 0.23934726]],
[[ 1.11108409, -0.22629592, -1.19200625],
[ 0.01428096, -0.47797041, 0.52255319],
[ 0.43058447, 0.7502894 , 0.80506491]],
[[-1.11081 , -1.08830345, 0.33361627],
[-0.6861629 , 0.08362868, 1.23887492],
[-0.68909073, 0.40941956, -0.47402409]]]])
In[3]: arr * 100 # 相当于把之前生成的以米为单位的数据转换成以厘米为单位
Out[3]: array([[[[ 34.07049939, -7.74945847, -80.89724426],
[ 17.3060466 , 22.07343784, -182.25354338],
[-146.20558018, -25.05390098, -274.69649117]],
[[ 20.45126167, 31.35518923, -16.36865464],
[ 6.82259511, 59.84345892, 16.75361816],
[ -10.917227 , -130.62581208, -13.01852024]],
[[ -59.89072299, -12.58084172, 0.89189026],
[ 97.45080331, 9.27112381, 39.00784994],
[ -65.85589338, 12.62153457, 137.55034484]]],
[[[ 72.47659751, -73.24574063, 150.13544647],
[ 37.25332419, 8.65092634, 92.75131933],
[-207.34203802, -69.22685695, 98.63826614]],
[[ 68.83460612, -26.4704887 , -51.55612426],
[ 135.50111149, -116.790166 , 109.74960258],
[ 124.24906067, 77.81696794, -44.98367473]],
[[ 84.23788049, -37.8004015 , -139.05568263],
[ 59.27188107, 134.77504467, 110.45498393],
[ -28.78917998, 26.21596175, -29.74008865]]],
[[[ -6.20531543, -102.51130174, 119.58091737],
[ 174.06293275, -62.46853859, 22.94712516],
[ 43.29864458, -14.84860984, 23.93472613]],
[[ 111.10840946, -22.6295918 , -119.20062457],
[ 1.42809634, -47.79704063, 52.25531851],
[ 43.05844658, 75.0289397 , 80.50649053]],
[[-111.0810004 , -108.83034517, 33.36162748],
[ -68.61629006, 8.36286826, 123.88749222],
[ -68.90907323, 40.94195574, -47.4024087 ]]]])
也许大家突然看到这么多的数据有点不适应,这很正常。
一是因为我们随机生成的数字保留了8位小数,会显得数字较多;
二是4维数组本身的数据量就比较大,这还是我们在Python中的效果,如果在Excel中更是无法想象了;
三是NumPy只是能够便捷高效地处理多维数据的计算,但解决不了在二维显示器上的多维数据展示问题,也只能将多维数据转化为二维数据进行展示;
四是这里是为了展示ndarray的计算效果,所以把结果全部展示了出来,但在我们真正使用的时候,数据量会比这个多得多得多,所以只需要直接计算就好了,完全没有必要把结果一一展示出来,就算需要读取结果,也是按照我们的程序需要,读取特定的某一个或者多个结果,而不是显示全部结果。
包括我们在后面的学习过程中,大部分也只会使用二维数组进行举例,不会出现这么大量的数字,所以大家不必担心。
如果不考虑数据的个数,只看ndarray的计算过程,那么转换的过程就是用一个简单的乘法公式arr*100就实现了,是不是像做加减法一样简单,而且简单的不可思议?
这就是为什么各类公众号以及推广广告都在说Python比Excel强大得多,效率也高得多。且不说广告的效果,但Python的强大那是真的,主要就得益于NumPy、Pandas等对于多维数据便捷且强大的处理能力。
所以大家选择Python来学习真的没错!
以上就是对多维数组以及ndarray的介绍,了解了这些概念,下一篇我们就来学习一下ndarray是如何生成的,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
要阅读《手把手陪您学Python》——NumPy系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》系列文章入门阶段的篇目已经全部完成。
为更加清晰地展示Python入门阶段的知识体系,整理了如下的鱼骨图,以方便大家查阅。
如要阅读相应篇目的内容,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手47”,即可免费下载本篇文章所用示例语句。
