01-python-numpy-basic

1. NumPy之:NumPy简介教程

简介

NumPy是一个开源的Python库,主要用在数据分析和科学计算,基本上可以把NumPy看做是Python数据计算的基础,因为很多非常优秀的数据分析和机器学习框架底层使用的都是NumPy。比如:Pandas, SciPy, Matplotlib, scikit-learn, scikit-image 等。

NumPy库主要包含多维数组和矩阵数据结构。 它为ndarray(一个n维数组对象)提供了对其进行有效操作的方法。 NumPy可以用于对数组执行各种数学运算。 并且提供了可在这些数组和矩阵上运行的庞大的高级数学函数库。

安装NumPy

有很多方式可以按照NumPy:

pip install numpy

如果你使用的是conda,那么可以:

conda install numpy

或者直接使用Anaconda. 它是一系列数据分析包的集合。

Array和List

Python中有一个数据类型叫做List,list中可以存储不同种类的对象。在应用程序中这样做没有什么问题,但是如果是在科学计算中,我们希望一个数组中的元素类型必须是一致的,所以有了NumPy中的Array。

NumPy可以快速的创建Array,并且对其中的数据进行操作。

NumPy中的Array要比Python中的List要快得多,并且占用更少的内存空间。

看下两者之间的性能差异:

上面的例子对一个包含一百万的数据进行乘2操作,可以看到,使用NumPy的效率是Python的几十倍,如果在大型数据项目中这个效率会造成非常大的性能影响。

创建Array

上面的例子中,我们已经创建了一个array,使用的是np.arange方法。

我们还可以通过List来创建Array,List可以是一维列表,也可以是多维列表:

和List一样,Array也可以通过index来访问:

接下来我们介绍几个常用的名词:

  • vector — 表示的是一维数组

  • matrix — 表示的是二维数组

  • tensor — 表示的是三维或者更高维度的数组

在NumPy中维度也被称之为 axes

下面我们来看下其他几种创建Array的方法:

最简单的就是np.array,之前的例子中我们已经提到过了。

如果要快速的创建都是0 的数组,我们可以使用zeros:

或者都填充为1:

还可以创建空的数组:

注意,empty方法中的内容并不一定是空的,而是随机填充数据,所以我们在使用empty创建数组之后,一定要记得覆盖其中的内容。使用empty的好处就是创建的速度比较快。

还可以在range范围内填充数组:

可以指定间隔:

使用linspace可以创建等分的数组:

默认情况下创建的数组内容类型是np.float64,我们还可以将其切换成整数:np.int64

Array操作

sort

我们可以使用sort对数组进行排序:

==sort==是对Array中的元素进行排序, 除了sort之外还有其他的一些排序的方法。

还可以使用argsort,argsort是一种间接排序的方法,他返回的是排序好的原数组的index:

上面我们对array进行==argsort==,排序之后应该返回,5,6,10。 5的index是1,6 的index是2,10的index是0,所以返回1,2,0。

==lexsort==和argsort一样都是间接排序法,返回的都是排序过后的index,不同是lexsort 可以进行多key的排序。

上面的lexsort是先按照surnames排序,然后再按照first_names进行排序。

lexsort 的排序顺序是从后到前。也就是最后一个传入的key最先排序。

==searchsorted==用来查找要插入元素的index值,举个例子:

==partition==是对要排序的数据进行分割,举个例子:

第一个参数是一个Array,第二个参数是要分隔的基准元素,这个基准元素的位置和排序过后的位置是一样的,其他的元素比基准元素小的放在前面,比基准元素大的放在后面。

还可以按照多个元素进行分割:

concatenate

concatenate用来连接多个数组。

还可以连接多维数组:

统计信息

ndarray.ndim 用来统计数组的维数:

ndarray.size 用来统计数组中的元素个数:

ndarray.shape 输出数组的形状:

说明上面的数组是一个3 * 2 * 4 的数组。

reshape

使用reshape可以重新构造一个数组。

上面我们将一个一维的数组转成了一个3* 2 的数组。

reshape还可以接受多个参数:

第一个参数是要重构的数组,第二个参数新的shape,order可以取三个值,C,F或者A。

C表示按照C的index方式进行排序,F表示按照Fortran的index方式进行排序。A表示自动选择。

在Fortran中,当移动存储在内存中的二维数组的元素时,第一个索引是变化最快的索引。 当第一个索引更改时移动到下一行时,矩阵一次存储一列。另一方面,在C中,最后一个索引变化最快。

增加维度

np.newaxis可以给现有的数组增加一个维度:

还可以使用expand_dims来指定axis的位置:

index和切片

数组的index和切片跟Python中的list是类似的:

除此之外,数组还支持更多更强大的index操作:

上面我们找出了a中所有元素小于5的值。

可以看到a< 5 其实返回的也是一个数组,这个数组的元素shape和原数组是一样的,只不过里面的值是true和false,表示是否应该被选择出来。

同样的,我们可以挑出所有大于5的元素:

选出所有可以被2整除的数:

还可以使用 & 和 | 运算符:

还可以使用nonzero来打印出满足条件的index信息:

上面返回的元组中,第一个值表示的是行号,第二个值表示的是列。

从现有数据中创建Array

我们可以使用 slicing , indexing,np.vstack(),np.hstack(),np.hsplit(),.view(),copy() 来从现有数据中创建Array。

前面的例子中,我们看到可以使用List和切片来创建新的数组:

两个现有的数组可以进行垂直或者水平堆叠:

使用hsplit 可以将大的数组分割成为几个小的数组:

算数运算

array的加法:

其他的运算:

array求和:

如果是求和多维数组的话,需要指定维度:

其他有用操作

这里列出了其他的有用操作:

对于二维数组来说,sum默认会求和所有的元素,min也会从所有元素中查找最小的:

我们还可以指定维度:

矩阵

矩阵就是 2 * 2 的数组:

矩阵同样可以进行统计操作:

默认情况是累加所有的元素,我们也可以指定特定的累加维度:

矩阵的运算:

如果是多维的和低维的进行运算,那么将会使用内置的broadcast机制,将低维的进行广播:

生成随机数

在机器学习中,生成随机数是一个非常重要的功能。我们看下如何在Numpy中生成随机数。

unique

np.unique可以统计数组的唯一值:

还可以返回index或者count:

对矩阵也适用:

如果想得到唯一的行或者列,可以传入axis参数:

矩阵变换

我们可以使用transpose来把矩阵的行和列进行调换:

反转数组

使用flip可以反转数组:

如果是2维的数组:

默认会反转行和列,我们也可以只反转行或者列:

还可以只反转一行或者一列:

flatten 和 ravel

flatten 可以将数组变成一维的:

flatten之后的数组和原数组是无关的,我们修改flatten之后的数组不会改变之前的数组内容:

但是如果使用ravel,对新数组的修改同样也会改变原始数组:

save 和 load

NumPy 的对象可以通过save和load存放到文件和从文件中加载:

如果想以文本的方式来存储,那么可以使用np.savetxt:

CSV

NumPy有专门的方法来对CSV文件进行操作:

本文已收录于 www.flydean.com

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

最后更新于

这有帮助吗?