布尔型索引
将使用numpy.random中randn函数来生成一些正态分布的随机数据
此外,还可以将布尔型数组跟切片、整数混合使用
选取这三个名字中的两个需要组合应用多个布尔条件:使用&、|、之类的布尔运算符即可
通过布尔类型索引选取数组中的元素,将总是创建数据的副本,即使返回一模一样的数组也是如此
通过布尔类型数组设置值是一种经常用到的手段。为了将data中的所有负值都设置为0,只需:
花式索引
它是利用整数数组进行索引。
为了以特定顺序选取子集,只需传入一个用于指定顺序的整数列表或ndarray即可
使用负数索引将会从末尾开始选取行
花式索引跟切片不一样,它总是将数据复制到新数组中
数组转置和轴对换
转置是重塑的一种特殊方式,它返回的是源数据的视图(不会进行任何复制操作)。数组不仅有transpose方法,还有一个特殊的T属性。
在进行矩阵运算时,经常需要用到该操作,比如利用np.dot计算矩阵内积xT *x
通用函数:快速的元素级数组函数
sqrt:计算平方根 exp:计算各元素的e的x次方
其他的各种函数参考函数表吧!
利用数组进行数据处理
NumPy数组使你可以将许多中数据处理任务表述为简洁的数组表达式(否则需要编写循环)。用数组表达式代替循环的方法,称为矢量化。
一般来说,矢量化数组运算要比等价的纯Python方式快上一两个数量级,尤其是各种数值计算。在后面的内容(12章的广播),这是一种针对矢量化计算的强大手段
计算sqrt(x^2+y^2)。np.meshgrid函数接收两个一维数组,并产生两个二维数组(对应两个数组中的x,y)
计算结果如下:
可视化如下:
这张图是用matplotlib的imshow函数创建的
将条件逻辑表述为数组运算
假设我们想要根据cond中的值选取xarr和yarr的值:当cond中的值为True时,选取xarr的值,否则选取yarr的值
numpy.where函数是三元表达式x if condition else y的矢量化版本。
如果用列表推到式的写法如下:
1 result=[(x if c else y) 2 for x,y,c in zip(xarr,yarr,cond)]
这样写有几个问题:第一:它对大数组的处理速度不是很快。第二:无法用于多维数组。
np.where的第二个和第三个参数不必是数组,他们都可以是标量值。假如希望将正值替换为2,负值替换为-2:
数学和统计方法
可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行计算。
某个轴向代表某一列哦!
这些函数既可以当做数组的实例方法调用,也可以当作顶级NumPy函数使用。也就是说
arr.mean()与np.mean(arr)效果相同!
mean和sum这类的函数可以接受一个axis参数(用于计算该轴向上的统计值)
基本数组统计方法:
sum :对数组中全部或某轴向的元素求和。零长度的数组的sum为0
mean:算术平均值。零长度的数组的mean为NaN
std、var:分别为标准差和方差,自由度可调(默认为n)
min、max:最大值和最小值
argmin、argmax:分别为最大和最小元素的索引
cumsum:所有元素的累计和
cumprod:所有元素的累计积
用于布尔类型数组的方法
在上面这些方法中,布尔值会被强制转换为1(True)和0(False)。因此,sum经常被用来对布尔类型数组中的True值计数
另外还有两个方法:any和all,它们对布尔型数组非常有用。any用于测试数组中是否存在一个或者多个True,而all则检查数组中所有值是否都为True:
当然,这两个方法也能用于非布尔值类型数组,此时所有非0元素将会被当做True
排序
跟Python内置的列表类型一样,Numpy数组也可以通过sort方法进行排序
多维数组可以指定任何一个轴进行排序
唯一以及其他的集合逻辑
unique用于找出数组中的唯一值并返回已排序的结果:
另一个函数:np.in1d(是数字1哦!)用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔类型数组
还有其他的集合运算见书中的表
用于数组的文件输入输出
NumPy能够读写磁盘上的文本数据或二进制数据。后面的章节将会告诉你一些pandas中用于将表格形数据读取到内存的工具
将数组以二进制格式保存到磁盘
np.sava和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为.npy文件中的。
如果文件路径末尾没有扩展名.npy,则该扩展名会被自动加上。然后就可以通过np.load读取磁盘上的数组:
通过np.savez可以将多个数组保存到一个压缩文件中,将数组以关键字参数的形式传入即可:
加载.npz文件时,你会得到类似字典的对象,该对象会对各个数组进行延迟加载。
存取文本文件
更多的有关文件读写(尤其是表格型数据)的知识,请参阅本书后面有关pandas和DataFrame对象的章节
线性代数
NumPy提供了一个用于矩阵乘法的dot函数(既是一个数组方法也是numpy命名空间中的一个函数)
numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西,它们跟R和MATLAB等语言所使用的是相同的行业标准级Fortran库
常用的numpy.linalg函数:
diag:以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵
dot:矩阵乘方
trace:计算对角线元素的和
det:计算矩阵行列式
eig:计算方阵的本征值和本征向量
inv:计算方阵的逆
qr:计算QR分解(也是LR分解)
svd:计算奇异值分解(SVD)
solve:解线性方程组Ax=b,其中A为一个方阵
lstsq:计算Ax=b的最小二乘解
随机数生成
numpy.random模块对Python内置的random进行了补充,增加了一些用于高效生成多种概率分布的样本值的函数。例如你可以用normal来得到一个标准正态分布的4*4样本数组
而Python内置的random模块则只能一次生成一个样本值。numpy.random快了不止一个数量级。
部分numpy.random函数:
randn:产生正态分布(平均值为0,标准差为1)的样本值,类似于MATLAB接口
seed:确定随机数生成器的种子
rand:产生均匀分布的样本值
randint:从给定的上下限范围内随机选取整数
binomial:产生二项分布的样本值
normal:产生正态分布(高斯)的样本值
chisquare:产生卡方分布的样本值
uniform:产生在[0,1)中均匀分布的样本值