NumPy入门系列(一)

NumPy入门系列(一)

何为Numpy?

NumPy(NumericalPython的简称)是Python数值计算最重要的基础包。NumPy的功能如下:

  • ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数 组。
  • 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。
  • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
  • 线性代数、随机数生成以及傅里叶变换功能。
  • 用于集成由C、C++、Fortran等语言编写的代码的ACAPI。

为什么用NumPy?

高效性,直观感受一下吧!


NumPy入门系列(一)

基于NumPy的算法要比纯Python快10到100倍(甚至更快),并且使用的内存更 少。

numpy最基础的东西---ndarray

NumPy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速而 灵活的大数据集容器。你可以利用这种数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样。

创建ndarray:


NumPy入门系列(一)


NumPy入门系列(一)


NumPy入门系列(一)

总结如下:

NumPy入门系列(一)

ndarray的数据类型:dtype

dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息:


NumPy入门系列(一)

你也可以通过ndarray的astype方法明确地将一个数组从一个dtype转换成另一个 dtype:

NumPy入门系列(一)

NumPy入门系列(一)

NumPy数组的运算---矢量化

不用编写循环即可对数据执行批量运算大小相等的数组之间的任何算术运算都会将运算应用到元素级:

NumPy入门系列(一)

NumPy入门系列(一)

不同大小的数组之间的运算叫做广播(broadcasting),将会在以后介绍。

基本的索引和切片

一维数组的切片和列表类似:

NumPy入门系列(一)

跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上,如果要生成副本,你需要显式调用copy()。

NumPy入门系列(一)

多维数组切片索引:

在一个二维数组中,各索引位置上的元素不再是标量而是一维数组,可以对各个元素进行递归访问,但这样需要做的事情有点多。你可以传入一 个以逗号隔开的索引列表来选取单个元素:

NumPy入门系列(一)

下图说明了二维数组的索引方式:轴0作为行,轴1作为列

NumPy入门系列(一)

高维数组的索引方法类似:


NumPy入门系列(一)

同样,在上面所有这些选取数组子集的例子中,返回的数组都是视图。

切片索引

NumPy入门系列(一)

NumPy入门系列(一)

总结:切片规则

NumPy入门系列(一)

自然,对切片表达式的赋值操作也会被扩散到整个选区:

NumPy入门系列(一)

布尔索引

NumPy入门系列(一)

NumPy入门系列(一)

高级索引

NumPy可以利用整数数组进行索引。为了以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可:

NumPy入门系列(一)

采用传递数组的索引跟切片不一样,它总是将数据复制到新数组中,即生成一个副本。

数组转置和轴对换

转置是重塑的一种特殊形式,它返回的是源数据的映像(不会进行任何复制操 作)。数组不仅有transpose方法,还有一个特殊的T属性:

NumPy入门系列(一)

NumPy入门系列(一)

高维数组的烧脑转置:回到二维数组的转置

对于高维数组,transpose需要得到一个由轴编号组成的元组才能对这些轴进行转置,实际上,对二维数组的转置的等价形式transpose((1,0)):

NumPy入门系列(一)

这里(1,0)可以理解为轴序,原序为(0,1),即让原来的1轴上的数据作为现在的0轴上的数据。当然,你不理解也没关系,接下来只要你知道二维数组是怎么转置的即可。任何高维数组的转置最终都可以变为二维数组的转置,前提是怎么变为二维数组(或者说怎么理解成二维数组),看一个简单的例子:

NumPy入门系列(一)

(1,0,2)代表轴0和轴1交换,2轴并未受到影响,那么不妨将[1,2,3]看成一个单独的数据,记为a,

同样,b=[ 4, 5, 6],c=[ 7, 8, 9],d=[10, 11, 12],那么arr=[[a,b],[c,d]],这就是一个二维数组,转置:

arr=[[a,c],[b,d]],再代换回来,就是上面的结果。再看一例,0轴不变,交换1和2 轴:

NumPy入门系列(一)

发现什么了没?你可以将arr看作arr=[a,b],a=[[ 1, 2, 3], [ 4, 5, 6]],b=[[ 7, 8, 9], [10, 11, 12]],这里a,b就是二维数组,因此arr.transpose((0,2,1))等价于[a.T,b.T],我们不妨称之为抽取二维数组法。更深入一点,看下例:

NumPy入门系列(一)

有没有点思路,实际上可以看成(0,1,2)先0轴和1轴交换(1,0,2),得到的新数组1轴和2轴交换(1,2,0),结果一样:

NumPy入门系列(一)

再深入一点:arr.transpose((2,1,0)),记住不能跨维交换,0和2 不能直接交换,因为我们要转化为二维的,只能相邻轴交换,0与1,1与2。

(2,1,0)

--------0和1交换(1,0,2)对应transpose((1,0,2))

-------1和2 交换(2,0,1)对应transpose((2,1,0))

-------0和1交换(2,1,0)对应transpose((0,2,1)):

NumPy入门系列(一)

结果一致!而上述三步分解操作都可以按前面所说理解成二维数组的转置操作,也就是进行了三次转置。

本文基本涵盖了NumPy多维数组生成与索引操作的所有基本知识,一下肯定消化不完,如果觉得有用,记得收藏加关注哟~欢迎下方评论区交流探讨。


分享到:


相關文章: