
此文是《10周入门资料分析》系列的第15篇
想了解学习路线,可以先阅读 学习计画 | 10周入门资料分析
前两篇讲了Python的基础,今天开始进入Python资料分析工具的教程。
Python资料分析绝对绕不过的四个包是numpy、scipy、pandas还有matplotlib。
numPy是Python数值计算最重要的基础包,大多数提供科学计算的包都是用numPy的阵列作为构建基础。专门用来处理矩阵,它的运算效率比列表更高效。
scipy是基于numpy的科学计算包,包括统计、线性代数等工具。
pandas是基于numpy的资料分析工具,能够快速的处理结构化资料的大量资料结构和函数。
matplotlib 是最流行的用于绘製资料图表的 Python 库。
本文先分享NumPy包。
NumPy 的 ndarray:多维阵列物件
numpy的资料结构是n维的阵列物件,叫做ndarray。可以用这种阵列对整块资料执行一些数学运算,其语法跟标量元素之间的运算一样。
创建并操作多维阵列:
ndarray物件中所有元素必须是相同类型的,每个阵列都有一个shape和dtype。

创建 ndarray:一种多维阵列物件
创建阵列最简单的办法就是使用 array 函数,它接受一切序列型物件(包括其它阵列),然后产生一个新的NumPy阵列(含有原来的资料)。
np.array会尝试为新建的这个阵列推断出一个较为合适的资料类型,这个资料类型保存在一个特殊的dtype物件中。
zeros 和 ones 也分别可以创建指定大小的全 0 或全 1 阵列,empty 可以创建一个没有任何具体值的阵列(它返回的都是一些未初始化的垃圾值):
arange是 Python 内置函数range的阵列版,np.arange返回间隔均匀的一些值。
ndarray 的资料类型
dtype(资料类型)是一个特殊的物件,它含有 ndarray 将一块记忆体解释为特定资料类型所需的资讯。
需要知道你所处理的资料的大致类型是浮点数、複数、整数、布林值、字串,还是普通的 python 对象。当需要控制资料在记忆体和磁片中的存储方式时,就得了解如何控制存储类型。
可通过ndarray的astype方法显示地转换其dtype:
若将浮点数转换成整数,则小数部分将会被截断。
若某字串阵列表示的全是数位,可用astype将其转换为数值形式:
这里没写 np.float64 只写了 float,但是NumPy会将 Python 类型映射到等价的dtype上。
阵列的dtype的另一个用法:
u4(unit32):无符号的 32 位元(4个位元组)整型。
调用astype无论如何都会创建出一个新的阵列(原始资料的一份拷贝)。
浮点数只能表示近似的分数值,在複杂计算中可能会积累一些浮点错误,因此比较操作只在一定小数位以内有效。
阵列和标量之间的运算
阵列:可对资料执行批量运算(不用编写迴圈即可)。这通常叫做向量化(vectorization)。
大小相等的阵列之间,它们之间任何的算数运算都会应用到元素级(每个元素都做这个运算了),阵列与标量的算数运算也是。
不同大小的阵列之间的运算叫做广播(broadcasting)。
基本的索引和切片
资料不会被複製,任何修改都直接改了原阵列。
如果仅是要一份副本,则用 .copy()。
这两种方式等价。
若arr2d[2],则输出的是一维阵列[7,8,9]。
223的阵列(2组2行3列):
切片索引
###布林型索引
需要先引入:from numpy.random import randn
或将程式码改成:data = np.random.randn(7, 4)
布林型阵列的长度必须跟被索引的轴长度一致。每个名字对应 data 阵列一行。
对条件进行否定的两种方式:
组合应用多个布林条件,可使用&、|等布林算术运算子:
透过布林型索引选取阵列中的阵列,将总是创建资料的副本,即使返回一模一样的阵列也是一样。
透过布林型阵列设定值:
透过一维布林阵列设置整行或列的值:
花式索引
指利用整数阵列进行索引。
np.empty((8,4))
Return a new array of given shape and type, without initializing entries.
for i in range(8):
arr[i] = i
Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step.
为了以特定顺序选取行的子集,只需传入一个用于指定顺序的整数清单或 ndarray,使用负数索引会从末尾开始选取行(最后一行是 -1)。
一次传入多个索引组,返回一个一维阵列:
取整列的两种方法,相当于给列排了顺序:
花式索引跟切片不一样,总是将资料複製到新阵列中。
阵列转置和轴对换
转置返回的是来源资料的视图,不进行任何複製操作。阵列有 transpose 方法,还有一个 T 属性来完成转置:
高维阵列
Transpose 要一个轴编号:
arr是 2 组 2 行 4 列的阵列,transpose的参数表示shape的形状,对于这个例子来说,即2[0]、2[1]、4[2],transpose(1,0,2)转置后变为2[1]、2[0]、4[2],看起来仍是 2 组 2 行 4 列的形状,但阵列内的元素经过转换后索引已经改变,也要遵循(1,0,2)的顺序。如转置前的阵列arr[0,1,0]索引值为 4,转置后的阵列arr’[1,0,0],索引值才为 4。其它同理。
ndarray 的 swapaxes 方法接受一对轴编号且返回来源资料的视图:
转置后的阵列arr.T为 4[2] 组 2[1] 行 2[0] 列阵列,swapaxes(1,2)就是将第二个维度(中括弧内数位)和第三个维度交换,即转换为 2 组 4 行 2 列。
通用函数:快速的元素级阵列函数
通用函数(即 ufunc)是一种对ndarray中的资料执行元素级运算的函数,就是一些简单函数。
利用阵列进行资料处理
用阵列运算式代替迴圈的做法,通常被称为向量化。NumPy 阵列将多种资料处理任务表述为阵列运算式。
np.meshgrid函数接受两个一维阵列,并产生两个二维矩阵(对应于两个阵列中所有的(x, y)对。
将条件逻辑表述为阵列运算
p.wherea函数是三元运算式x if condition else y的向量化版本。
np.where的第二个和第三个参数不必是阵列,传递给where的阵列大小可以不相等,甚至可以是标量值。在资料分析工作中,where通常用于根据另一个阵列而产生一个新的阵列。
用where表述出更複杂的逻辑:(where的嵌套)
用于布林型阵列的方法
有两个方法any和all。
排序
多维阵列可以在任何一个轴向上进行排序,只需将轴编号传给sort:
顶级方法np.sort返回的阵列已排序的副本,就地排序则会修改阵列。
唯一化以及其他的集合逻辑
np.unique找出阵列中的唯一值并返回已排序的结果。
np.in1d用于测试一个阵列的值在另一个阵列的情况。
乱数产生
numpy.random模组多了用于高效生产多种概率分布的样本值的函数(用来生成大量样本值)。
到这里,numpy的基础就讲解的差不多了,下周将讲解pandas和matplotlib。更深入的应用,后面也会分享实际应用这些包得资料分析,欢迎关注!
我是「数据分析那些事」。常年分享资料分析乾货,不定期分享好用的职场技能工具。