python数据处理
Python for Data Analysis, 3E作者原书电子版
pydata-book 作者的github页面(有ipynb文件供学习)
NumPy documentation Numpy官方文档
pandas documentation pandas官方文档
numpy
NumPy之于数值计算特别重要的原因之一,是因为它可以高效处理大数组的数据。这是因为:
- NumPy是在一个连续的内存块中存储数据,独立于其他Python内置对象。NumPy的C语言编写的算法库可以操作内存,而不必进行类型检查或其它前期工作。比起Python的内置序列,NumPy数组使用的内存更少。
- NumPy可以在整个数组上执行复杂的计算,而不需要Python的for循环。
ndarray
NumPy最重要的一个特点就是其N维数组对象(即ndarray),该对象是一个快速而灵活的大数据集容器。
创建 ndarray
array()
:array
函数接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy数组。嵌套序列(比如由一组等长列表组成的列表)将会被转换为一个多维数组
1 | 1,2,3,4) # WRONG a = np.array( |
np.array
会尝试为新建的这个数组推断出一个较为合适的数据类型,或者在创建时显式指定数据类型。数据类型保存在一个特殊的dtype对象中。
函数zeros
创建一个由0组成的数组,函数 ones
创建一个完整的数组,函数empty
创建一个数组,其初始内容是随机的,取决于内存的状态。默认情况下,创建的数组的dtype是 float64
类型的。
1 | 3,4) ) np.zeros( ( |
arange
可以创建一个在定义的起始值和结束值之间具有特定序列的数组。
1 | 10, 30, 5 ) np.arange( |
使用arange
默认输出一维数组,要创建其他形状的数组,用reshape
函数:
1 | 20).reshape(4,5) array = np.arange( |
其他创建数组的函数
full
函数创建一个填充给定值的n * n数组。
1 | np.full((2,2), 3) |
输出:
1 | array([[3, 3], |
eye
函数可以创建一个n * n矩阵,对角线为1s,其他为0。
1 | np.eye(3,3) |
输出:
1 | array([[1., 0., 0.], |
函数linspace
在指定的时间间隔内返回均匀间隔的数字。 例如,下面的函数返回0到10之间的四个等间距数字。
1 | np.linspace(0, 10, num=4) |
输出:
1 | array([ 0., 3.33333333, 6.66666667, 10.]) |
dtype
dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息,描述了如何解释与数组项对应的固定大小的内存块中的字节
它描述了数据的以下几个方面:
- 数据类型(整型、浮点型、Python对象等)。
- 数据的大小(例如整数中有多少字节)。
- 数据的顺序(little-endian 或 big-endian )。
- 如果数据类型是结构化数据类型,则是其他数据类型的集合(例如,描述由整数和浮点数组成的数组项)。
- 如果数据类型是子数组,那么它的形状和数据类型是什么。
可以通过ndarray的astype方法明确地将一个数组从一个dtype转换成另一个dtype
1 | In [37]: arr = np.array([1, 2, 3, 4, 5]) |
运算
大小相等的数组之间的任何算术运算都会将运算应用到元素级:
index
对于一维数组,和 python 列表差别不大
在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray(它含有高一级维度上的所有数据)。
在2×2×3数组arr3d中:
1 | In [76]: arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) |
arr3d[0]是一个2×3数组:
1 | In [78]: arr3d[0] |
相似的,arr3d[1,0]可以访问索引以(1,0)开头的那些值(以一维数组的形式返回):
1 | In [84]: arr3d[1, 0] |
slice
- 对于一维数组,和 python 列表差别不大
1 | In [60]: arr = np.arange(10) |
将一个标量值赋值给一个切片时(如arr[5:8]=12),该值会自动传播(也就说后面将会讲到的“广播”)到整个选区。跟列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上。
以下是示例:
1 | In [66]: arr_slice = arr[5:8] |
切片[:]
会给数组中的所有值赋值
1 | In [70]: arr_slice[:] = 64 |
如果要得到的ndarray切片的一份副本而非视图,就需要明确地进行复制操作,例如
arr[5:8].copy()
。