《python for data analysis》笔记三--Numpy基础:arrays和向量化计算2

继续Numpy基础...

1. Fancy Indexing

指的是用一个整数array来当做index下标,比如:arr[[4,3,0,6]] ,中间的那个array就是一个fancy indexing形式。也可以是负数形式,如arr[[-3,-5,-7]];

当传进的参数是multiple index arrays时,会选择各个array的相同下标,做为一个下标,比如:

arr = np.arange(32).reshape((8,4))

arr[[1,5,7,2],[0,3,1,2]]

会把[1,0]做为一个index,[5,3],[7,1],[2,2]分别做为下标取对应的元素值;

维数再高也是类似,当然,也可以缺省一个下标,表示,这一维的所有元素都取出,或者在上面采用slice indexing。

另外,还可以利用下标取值,并打乱其在某维度的顺序,比如:


可以看到,取出了1,5,7,2维度的所有值,并在那一维中使用顺序[0,3,1,2]做为新的顺序;

上述也可以用np.ix_() 函数实现,该函数传递两个参数,第一个做为要选取的1D arrays index,第二个表示1D中的顺序;

注意:fancy indexing和slicing不同,它通常将元素拷贝到新的array中。

 

2. Transposing Arrays and Swapping Axes

用arr.T来表示转置矩阵;

可以用np.dot(arr.T,arr)来计算两矩阵的内积(inner product) XTX;

arr.swapaxes(a,b):输入两个轴的编号,将两个轴转置,当arr为2维时,输入0,1;即表示arr.T;当为高维时,需要考虑它会出现什么结果。swapaxes与slicing类似,不返回新的array。

arr.transpose((...)):输入一个List表示转置后,之前的各个轴所在的位置;如arr.transpose((1,0,2))表示将轴0和轴1交换,等价于arr.swapaxes(0,1)。通常transpose()可以看做是一个或多个swapaxes()的结果。

 

3. Universal Functions: Fast Element-wisearray functions

通用函数,是一些对元素进行数学操作的函数,可以看出是vectorization的操作;如sqrt和exp;


常用的一元ufuncs函数:


常用的二元ufuncs函数:


4. Data Processing using Arrays

使用Numpy的arrays可以让本来需要写许多loops的操作可以用array表示,这种以array表示来替代loops的操作通常叫做vectorization;通常情况下,使用向量化的操作要比单纯的用python语言来计算速度要快上数倍。

np.meshgrid():给定两个1D的array,生成两个2D的matrices,大小为m*n,n为第一个array的长度,m为第二个array的长度;第一个matrix以第一个array为行,构造m行,为m*n矩阵;第二个matrix以第二个array为列,构造n列,为m*n矩阵;如:

x = np.arange(3)

y = np.arange(2)

xs, ys = np.meshgrid(x,y)

结果为:


遇到个问题:

matplotlib.pyplot 的Imshow()显示不出来... 不知道什么原因,没有错误...后面遇到这个绘图的东东还要再多学习呀...

 

5. Expressing Conditional Logic as ArrayOperations

np.where函数可以表达这种形式的操作:x ifcondition else y比如:


如果采用原始的python表达:


可以发现,不仅会很慢,而且会出错,另外,还不好用在多维array中;而如果采用np.where:


可以很节省时间和代码量,并且where的第2,3个参数可以不是array类型;np.where类似于三元操作符()?a:b;

np.where的典型应用是在数据分析中,基于一个array生成一个新的array;如下所示:


可以看到,传递至np.where的参数形式多样;

另外,还可以用np.where表示一个嵌套的判断,比如:


可以写成


事实上,根据bool类型的特性,这个式子还可以写成 result = 1*cond1 + 2*cond2 +3*(not(cond1|cond2)) 。

 

6. Mathematical and Statistical Methods


np.sum(arr)和arr.sum()等价;

可以用arr.mean(axis=1)来计算指定轴上的统计量;通常2维下,0表示列,1表示行;

其中argmin,argmax表示的是最小值最大值的下标;

cumsum:累加,cumsum(0)表示按列累加(比如第3行第1列的元素为第1,2,3行,第1列的元素值之和);为1表示按行累加;

cumprod相同,累乘,初始乘以1;

 

 


7. Methods for Boolean Arrays

上述操作的Boolean值通常被置为1(True)和0(False),sum函数通常可以用来计算True出现的次数;如:


还有两个有用的函数any和all,any用来判断array中是否存在True值;all用来判断array中是否所有值都为True,如:


这三个函数同样适用于非Boolean值的array,非零值为True,零值为False。

 

8. Sorting

ndarray中有sort函数,可以对array进行排序,调用方法为array.sort(axes);当为一维时,axes可不指定;当为多维时,如果不传入axes值,则默认对所有维度上元素进行排序,且重新转换为array的shape;当传入axes值时,可指定排序轴,比如二维情形下,0表示按列排序、1表示按行排序;如:


 

9. Unique and Other Set Logic

Numpy中有许多基本的1维集合操作函数,最常用的是np.unique,该函数返回排序后的Unique values array;如:


该函数功能等价于纯python语言中的sorted(set(names))

 

函数np.in1d(array,array),测试第一个array中的元素是否在第二个array中,并返回一个boolean array,如:

 

另外一些函数:如下表所示:


其中setxor1d(x,y)是指元素只在一个array中出现的集合;相当于setdiff1d( union1d(x,y), intersect1d(x,y))


10. File Input and Output with Arrays

Numpy可以读取或保存数据到磁盘,以文本形式或者二进制形式;

1)以二进制形式将array存储到磁盘上:

np.savenp.load是二进制保存和读取数据的函数,在磁盘上的文件后缀名为.npy格式;如:


还有一个可以保存multiplearrays到一个文件的函数np.savez(filename, *arg,s **kwds),后缀是.npz;如果不指定kwds,则系统会默认为其赋array名,比如:


可以看到默认的array名为arr_1,arr_0;可以用=号指定array名,如:


可以根据这个array名字来读取相应的array,如:


2)以文本形式存储和读取数据

简单的操作:


事实上,np.savetxt()函数有许多参数,如下图所示:


其中,fmt参数是一些格式化参数,暂时不学习,后面慢慢熟悉。

 

11. Linear Algebra

Numpy提供一些线性代数的操作函数,比如dot()实现两个矩阵相乘等,如:


numpy.linalg 模块包含一系列线性代数操作函数,这个模块和MATLAB与R一样,都是采用工业标准Forttran库实现的。下图是一些线性代数函数:


其中qr是QR分解,将一个矩阵分解为一个正交矩阵orthogonal matrix和一个上三角矩阵right triangular matrix;svd是奇异值分解,具体参考线性代数;

 

12. Random Number Generation

numpy.random是python本身random模块的扩充,可以有效生成不同概率分布下的样本值array;如normal分布:


Python的内置random模块仅在一个时间生成一个样本值,而numpy.random模块则不是,可以通过下面的实验看出numpy.random模块在生成大量样本值的时候较快;


下表给出了Numpy.random模块中的一些函数:


其中chisquare是卡方分布;

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值