想要用python写一些算法,发现得用到numpy,大致跟matlab差不多,花了半天时间,看了《利用python进行数据分析》(《python for data analysis》)中的第四章,整理了一下,贴出来分享给大家。
注意:有些图中的代码是我自己做的,有些是书中截图的。我做的,我直接from numpy import *,所以直接打函数名就可以了;书中应该是import numpy as np,所以每个函数都是np.函数。
第四章 Numpy基础:数组和矢量计算
1 numpy的ndarray:一种多维数组对象
多维数组ndarray
每个数组都有一个shape:注意是a.shape,不是a.shape()
有一个dtype,说明数据类型
创建ndarray
1 array(data)
维度:b.ndim
2 zeros() ones() empty():创建一个没有具体值的数组
注意:empty()返回的不是0值,是未初始化的垃圾值
3 arange()
ndarry的数据类型:dtype
a.astype(''):转类型
数组和标量之间的运算
数组相当于矢量化(vectorization),不用编写循环即可对数据执行批量运算。
1 大小相等的数组之间的任何运算都会将运算应用到元素级。
+-*/ 两个数组维度相同,应用到元素级:
2 数组与标量的运算也会传播到各个元素
3. 不同大小的数组之间的运算叫做广播(broadcasting),不做介绍。
基本的索引和切片
arr[5:8]=12,会将12赋值给arr[5],arr[6],arr[7];
注意:数组切片是原始数组的视图,即视图上的任何修改都会直接反映到源数组上!
如果想要得到一个副本,需要显示的进行复制操作:
arr[5:8].copy()
对于二维数组:
a[2,3]和a[2][3]是等价的。
切片索引

一个轴一个轴的切,中间用","分隔;冒号":"表示选取整个轴
布尔型索引
上面这个布尔型数组可以用于数组索引,将值为"True"的索引处数据取出来:
注意:布尔型数组的长度必须跟被索引的轴长度一致,比如这里布尔型数组长度为4,data第一轴的长度也为4
还可以使用不等于(!=),也可以使用负号(-)对条件进行否定:
可以使用&(和),|(或)之类的布尔运算符号:
常用手段:
将data中所有负值设置为0:data[data<0]=0
设置整行或整列的值:data[names!='a']=5
花式索引(Fancy indexing)
为了以特定顺序选取子集,只需传入一个用于指定顺序的正数列表或narray即可。
选出了a[4]a[7]a[1],并按数组顺序排列
如果整数数组是负数,则从末尾开始选:
同Python索引一样,正数从索引0开始,负数从-1开始,所以-1对应的是最后一行
一次传入多个索引,返回的是一个一维数组:
数组转置和轴对换
T属性(矩阵转置):也可以直接transpose(a)
对于高维数组,利用transpose(),需要得到一个有轴编号组成的元祖(没看懂怎么转的,感觉用不到):
注意:返回的是视图,改动视图会改动原数据
2 通用函数:快速的元素级数组函数
通用函数是对narray中的数据执行元素级运算的函数。
一元通用函数:
接上
二元通用函数,也可直接使用+-*/<>==!=
3 利用数组进行数据处理
用数组表达式代替循环的做法,被称为矢量化。相当于对数据进行批量处理,不用循环。
meshigrid(a,a)构造了一个网格,对应的(x,y)为网格上的点。
numpy.where()函数
where(condition, a, b) condition成立,置为a,否则置为b
数学和统计方法
mean(), sum()
mean()和sum()函数可以接受一个axis参数,用于计算该轴向上的统计值
a.sum(0)统计0轴(行)上的统计值,其实统计的是每列的和
a.sum(1)统计1轴(列)上的统计值,统计每行的和
在上面这些方法中,布尔值会强制转换为1(true)和(false)。
比如用sum统计>0的数:
排序sort()
多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort即可:
唯一化(unique)及其他逻辑集合
unique():返回数组中唯一值并返回已排序的结果:
4 文件输入输出
将数组以二进制格式保存到磁盘save(), load()
save()和load()函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中。
文件会自动加上.npy扩展名,然后就可以通过load()读取数据:
存取文本文件savetxt(), loadtxt()
如读取一个逗号分隔的txt文件:
保存则是np.savetxt('test.txt', arr)
5 线性代数(矩阵乘法,矩阵分解,行列式等操作)
矩阵乘法dot()
numpy.linalg中有一租标准的矩阵分解运算以及求逆等函数。
注意:
如果只是from numpy import *,不能直接使用inv等函数,需要linalg.inv()才能使用,或者把linalg import 进来:
6 随机数生成(random包)
numpy.random模块对python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值函数。
normal(size=(3,3)):得到一个标准正态分布3*3样本数据
没搞懂他俩有啥区别。。感觉randn和normal不是同一回事吗?