在使用numpy对ndarray对象进行处理时,我们动辄就会碰到大于二维的数据。这时候,很多小朋友肯定会犯难,如何理解这些数据?怎么才能在脑海里把这些数据跟我们的现实生活联系起来进行理解呢?今天,我带大家通过一个实例来深入理解一下这个数据结构。
【问 题】
我们手头有一栋新楼房(楼房没有门牌号),里面住着n个小猪佩奇。有一天,来了一只笨笨的佩奇,它找不到自己的家了。我们如何帮小猪佩奇梳理思路,找到家呢?有没有好的数据结构,能精确定位某一个小猪佩奇?
小猪佩奇找不到家了,我们帮帮它吧 【帮佩奇找家的思路】
看着佩奇找不到家,它开始急得哭了,我们不能着急啊。好吧,我们理一下思路。我们分三步帮佩奇找家吧:
定位楼层先问问佩奇:“你家在第几层楼呢?”
佩奇说到:“我记得好像是要上楼梯,不用坐电梯的,好像上得楼梯也不是很多……嗯嗯,对了,好像是在二层……”
好吧,我们终于定位了,这只佩奇好像是二层的佩奇小猪。
定位它在几单元这时候我们到楼下看到有好多单元,佩奇也急得快要哭了。这时候,小羊苏西蹦蹦跳跳过来了,它好像认识这只佩奇,兴奋的跟佩奇打招呼。它告诉我们,这只佩奇是1单元住的。于是,我们领着佩奇走到1单元2层……
定位在哪个房间好吧,我们终于到了1单元2层,但是这层有好多的住户,佩奇也记不得到底是哪间房了,它急得大哭起来。这时候,猪妈妈听到哭声,打开门……
佩奇终于到家了……
原来这只佩奇家住1单元2层203室……
佩奇终于到家了 【程序设计的角度定位佩奇家】
我们终于帮这只佩奇找到了自己的家,现在,我们对这只佩奇进行定位(2,1,03),相信大家都能够看懂了,我们定义了一种数据结构,第一个数代表2层,第二个数代表1单元,第三个数代表03室。这在Python中来说就是一个元组类型,如果我们想存储更多的信息呢?好吧,如这样:佩奇A家:(2,1,03),相信学过Python的人肯定会知道,用字典存储比较好了{'佩奇A家':(2,1,03), ……},它还能存储好多的其它佩奇家的信息,是不是很爽?
但是问题来了,如果佩奇王国里面都住着无数的小猪佩奇,我们怎么才能精确的定位某一个佩奇呢?字典的容量够不够?有没有更好的数据结构呢?
不用找了,我们使用Python的numpy库中的ndarray对象,这是个不错的选择。
【ndarray维度的理解】
通过之前的分析,我们知道当数据量巨大时,ndarray数组操作数据的效率肯定远远大于我们Python中的字典。
我们使用numpy创建一个三维数组(ndarray对象)
import numpy as np
a = np.arange(24).reshape(2, 3, 4)
我们定义的数组a结果如下。
array([[[ 0, 1, 2, 3],[ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])
我们可以这样理解这组数据,array中两个列表代表楼房的层高,然后里面有3个单元,每个单元有4户人家,这样,我们就能很好的理解这个维度,当维度增加1时,我们可以将视野扩展到整个小区,这栋楼是小区里面的几栋楼?当维度再增加1时,我们就将视野扩展到整个城市区域,增加的这个维度理解为城市中的某个小区……依次类推,我们以定义的这个三维数组开始理解。具体参照我使用jupyter notebook做的笔记内容。如下图所示。
按照第一个维度理解 增加至二维空间的理解 行列的理解 怎么样?这样理解是不是就好一点,比单纯的看到好多数据更加形象化了?大家对于ndarray对象有没更好的理解思路呢?欢迎大家留言讨论,感兴趣的关注我,后续会持续更新有关numpy的学习过程。
转载请注明出处(百家号:Python高手养成)