我爱编程

NumPy基础:数组和矢量计算

2017-08-16  本文已影响0人  进步小小青年

NumPy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。其部分功能包括:

对于大部分数据分析应用而言,我最关注的功能主要集中在:

一、NumPy的ndarray:一组多维数组对象

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

ndarray是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数据类型的对象)

1.创建ndarray

创建数组最简单的方法就是使用array函数。它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy的数组。

嵌套序列(比如由一组等长列表组成的列表),将会被转换成一个多维数组。

2.ndarray的数据类型

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

数值形dtype的命名方式相同:一个类型名(如float或int),后面跟一个用于表示各元素位长的数字。

3.数组和标量之间的运算

4.基本的索引和切片

NumPy数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式有限多。

在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray(它含有高一级维度上的所有数据)

5.切片索引

6.布尔型索引

布尔型数组的长度必须跟被索引的轴的长度一致。此外,还可以将布尔型数组跟切片、整数(或整数序列)混合使用

7.花式索引

花式索引(Fancy indexing)是一个NumPy术语,它指的是利用整数数组进行索引。

注:有关reshape的知识将在第十二章中讲解

In [108]:arr=np.arange(32).reshape((8,4))
In [109]:arr
out [109]:
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],
[24,25,26,27],
[28,29,30,31]])
In [110]:arr[[1,5,7,2],[0,3,1,2]]
Out [110]:array([4,23,29,10])
这个[110]索引,最终选出来的是元素(1,0)、(5,3)、(7,1)和(2,2)。
In [111]:arr[1,5,7,2][ : , [0,3,1,2]]
Out [111]:
array([[4,7,5,6,],
[20,23,21,22],
[28,31,29,30],
[8,11,9,10]])
另外一个办法是使用np.ix_函数,它可以将两个一维整数数组转换为一个用于选取方形区域的索引器:
In[112]:arr[np.ix_([1,7,5,2],[0,3,1,2])]
Out[112]:
array([[4,7,5,6,],
[20,23,21,22],
[28,31,29,30],
[8,11,9,10]])

8.数组转置和轴对换

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

In[110]:arr=np.arange(15).reshape((3,5))
In[111]:arr
Out[110]:
array([[0,1,2,3,4],
[5,6,7,8,9,],
[10,11,12,13,14]])

In[112]:arr.T
Out[112]:
array([[0,5,10],
[1,6,11],
[2,7,12]
[3,8,13],
[4,9,14]])
在进行矩阵计算时,经常需要要到该操作,比如利用np.dot计算矩阵内积XTX:

In[113]:arr=np.random.randn(6,3)
In[114]:np.dot(arr.T,arr)
Out[114]:
array([[2.584,1.8753,0.8888],
[1.8753,6.6636,0.3884],
[0.8888,0.3884,3.9781])

In[117]:arr.transpose((1,0,2))
Out[117]:
array([[[0,1,2,3],
[8,9,10,11]],
[[4,5,6,7],
[12,13,14,15]]])

简单的转置可以使用.T,它其实就是轴对换而已;ndarry还有一个swapaxes方法,它需要接受一对轴编号。
In[118]:arr
Out[118]:
array([[[0,1,2,3],
[4,5,6,7]],
[[8,9,10,11],
[12,13,14,15]]])

In[119]:arr.swapaxes(1,2)
Out[119]:
array([[[0,4],
[1,5],
[2,6],
[3,7]],
[[8,12],
[9,13],
[10,14],
[11,15]]])

二、通用函数:快速的元素级数组函数

三、利用数组进行数据处理

numpy数组可以将许多种数据处理任务表述为简洁的数组表达式。用数组表达式代替循环的做法,通常被称为矢量化。

1.将条件逻辑表述为数组运算

numpy.where函数是三元表达式 x if condntion else y 的矢量化版本
np.where的第二个和第三个参数不必是数组,他们都可以是标量值。在数据分析工作中,where通常用于根据另外一个数组而产生一个新数组。
例:假如有一个由随机数组成的矩阵,将所有正值替换为2,将所有负值替换为-2——np.where(arr>0,2,-2)
np.where(arr>0,2,arr)#只将正值设置为2.

2.数学和统计方法

可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算。sum、mean、以及标准差std等聚合运算(aggregation,通常叫做约简(reduction)),既可以当做数组的实例方法调用,也可以当做顶级NumPy函数使用。

3.用于布尔型数组的方法

4.排序

根python内置的列表类型一样,NumPy数组也可以通过sort方法就地排序

5.唯一化以及其他的集合逻辑

NumPy提供了一些针对一维ndarray的基本集合运算。最常用的可能要数np.uniqe了, 它用于找出数组中的唯一值并返回已排序结果。

数组的集合运算

四、用于数组的文件输入输出

1.将数组以二进制格式保存到磁盘

np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的。
In[183]:arr=np.arange(10)
In[184]:np.save('some_array',arr)

2.存取文本文件

有时,我们需要用np.loadtxt或更为专门化的np.genfromtxt将数据加载到普通的NumPy数组中。

五、线性代数

线性代数(如矩阵乘法、矩阵分解、行列式以及其他方阵数学等)是任何数组库的重要组成部分。NumPy提供了一个用于矩阵乘法的dot函数(既是一个数组方法也是NumPy命名空间的一个函数)

六、随机数生成

numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。

七、范例:随机漫步

上一篇 下一篇

猜你喜欢

热点阅读