NumPy进阶修炼|你真的了解NumPy吗

我的公众号:早起Python

========

大家好,上周发布的Pandas进阶修炼120题不知道各位做的怎么样,现在NumPy系列也闪亮登场!在上个系列一直让我很遗憾的就是对一些重要的函数没有进一步讲解(当然有读者制作的b站讲解视频填补了这一空缺)。所以在NumPy系列中,为了系统的学习NumPy的各种操作,类似于Pandas120系列的习题肯定少不了,但是还会有一些理论的讲解,我们开始吧!

首先问大家几个问题,NumPy是什么为什么使用NumPyNumPy又好在哪里?接下来我将尽可能的使用人话给大家整明白。

什么是NumPy

从官方文档来看NumPy是Python的一个用于科学计算的基础包。它提供了多维数组对象和一个用于数组快速运算的混合的程序,包括数学,逻辑,排序、线性代数等操作。说人话就是它能比标准Python序列更快的进行计算👇

为什么要用NumPy

经常有人拿List和NumPy比,为什么使用NumPy而不是List?List也可以存储数据啊,答案是NumPy处理数据比list要快很多,如果使用List是坐普通列车,那么NumPy就是坐高铁(❌)?坐火箭(✅)。那么下一个问题就来了,为什么NumPy会这么快?因为NumPy使用的是固定类型,想象一下我们有这样一个3*4矩阵

现在我们来通过放大这个5来比较NumPy与List的不同,大家都知道在计算机中都是利用二进制来存储数据,所这个5在计算机中是由8个二进制位组成的字节👇

而在我们使用NumPy时候,这个5会被转换为包含4个字节的int32类型👇

但是在Numpy中你可以说这32位太长,然后指定为16位甚至8位都行

 

现在来看看List,在Python中一个list存储了值,类型等四个对象👇

而我们的计算机会将这四个信息值都转换为二进制再进行读写👇

感受到了吗,所以为啥NumPy比List快,因为它使用的内存字节更少所以我们的计算机可以更快速的读取。

 

并且更为重要的一点是,在我们遍历Numpy对象的每一个元素的时候,我们不需要每次都进行类型检查,原因还是NumPy使用的是固定类型。而在list中,我们可能会有整数、浮点数、字符串等,所以每一次使用都需要检查每个元素的类型。

当然Numpy比list快的另一个原因是Numpy使用的是连续内存分配。想象一下这就是我们的计算机内存,我们可以将信息存储在这些内存中的任何一个中👇

 

 

假如我们有8个内存块存储信息,因为Python列表中的元素类型是任意的,并且可以像图中一样混乱排列,所以List实际上是用指针指向不同的地址,只能通过寻址方式找到下一个元素。而NumPy中的所有元素的类型都是相同的,所以NumPy在存储元素时内存可以连续👇

 

 

而这样做可以更快的进行计算并且也可以有效的利用缓存。

最后,List能做的事比如插入、增加、删除数据NumPy都可以搞定,List不能做的事,NumPy也能搞定,比如我有两个list

a = [1,2,3]

b = [4,5,6]

如果我直接计算a*b,那么list并不会给出我们想要的[1*4,2*5,3*6],而是直接报错,但是NumPy就可以轻松搞定👇

a = np.array([1,2,3])

b = np.array([4,5,6])

a * b = array([ 4, 10, 18])

结束语

好了,以上就是NumPy进阶修炼|第一期的内容,内容可能比较抽象,但我想这是一名NumPy高手所需要了解的知识。下一期开始就会从代码讲起,所以还等什么,抓紧分享给小伙伴上车学NumPy,没有留言功能的我,分享与在看是对我唯一的鼓励,催更就来点点,至于会更新几期我也不知道,毕竟这次不再仅仅是刷题。拜拜~

posted @ 2020-04-13 11:16  刘早起  阅读(217)  评论(0编辑  收藏  举报