1. NumPy简介
NumPy是Numerical Python的简称,用作高性能计算和数据分析,其操作是围绕
ndarray
这么一个矩阵元素来进行。针对数据分析的应用,NumPy主要功能体现在如下几个方面:
- 用于数据清理和整理、子集构造和过滤、转换等快速的矢量化数组运算
- 常用的数组算法,如排序、唯一化、集合运算等
- 统计和数据聚合运算
- 异构数据的合并/连接/转换
2. 使用NumPy进行数据处理
- 函数库的导入,以下简写成
np
import numpy as np
2.1 矩阵的创建
In [1]: arr = np.array([[1,2,3]])
In [2]: arr
Out[2]: array([[1, 2, 3]])
也可以像下面这样批量生成
In [3]: arr = np.array([[1,2,3]]).repeat(4, axis=0)
In [4]: arr
Out[4]:
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
- 或者我想初始化一个空的矩阵,只需要提供行和列即可,例如想创建3×4的矩阵,用empty或者zeros函数
In [6]: arr = np.empty((3,4))
In [7]: arr
Out[7]:
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
- 查看矩阵的维度,行列数以及元素的数据类型
In [10]: arr = np.array([[1,2,3],[4,5,6]])
In [11]: arr
Out[11]:
array([[1, 2, 3],
[4, 5, 6]])
In [12]: arr.ndim
Out[12]: 2
In [13]: arr.shape
Out[13]: (2, 3)
In [14]: arr.dtype
Out[14]: dtype('int64')
这里需要理清一个“轴”的概念
轴(axis)和矩阵空间的维度相关,举个例子,在平面坐标系中,x轴与y轴构成二维的平面,由此,x,y,z三个轴组成三维立体空间;再来看矩阵,如果矩阵是二维的,那么它由2个轴组成,np将它们表示成0轴和1轴,0轴修饰“列方向”,1轴修饰“行方向”,0轴的长度为列向量长度,1轴的长度为行向量长度,那么以上
arr = np.array([[1,2,3]]).repeat(4, axis=0)
可以理解成将向量[1,2,3]
在列方向上重复多次,生成了4×3矩阵,可以试验一下axis=1
的情况,答案是仍然生成一个一维的行向量,因为它是按照行方向延伸的;推广到三维,不难发现,三维空间可以看做由多个二维平面层叠生成的,则三维空间的0轴修饰“平面”,1轴修饰平面的“列”,2轴修饰平面的“行”。
注:矩阵的创建函数:
array # 将输入数据转换为ndarray,可以指定dtype
asarray # 将输入转换为ndarray
arange # 类似于Python的range函数,可以指定范围和步长
ones # 初始化为一个全1的数组
zeros # 初始化为一个全0的数组
empty #只分配内存空间,但不进行初始化
eye/identity # 创建方阵,对角线为全1,其余为0
2.1 数据存取
支持Python的下标和切片访问,但是np可以给切片直接赋值,并且切片赋值会影响到原始数组,这是因为切片操作不会对数据进行复制,数据只在内存保留一份,对切片的赋值也就是更改原始内存,如果想在切片上重新分配一块内存区域,可以使用ndarray.copy()
函数。
In [22]: arr = np.arange(10)
In [23]: arr
Out[23]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [24]: arr[5]
Out[24]: 5
In [25]: arr[5:8]
Out[25]: array([5, 6, 7])
In [26]: arr[5:8] = 10
In [27]: arr
Out[27]: array([ 0, 1, 2, 3, 4, 10, 10, 10, 8, 9])
2.3 矩阵运算
- 变换
In [28]: arr = np.arange(15).reshape((3,5))
In [29]: arr
Out[29]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
# 转置操作
In [30]: arr.T
Out[30]:
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
# 矩阵乘法
In [31]: np.dot(arr, arr.T)
Out[31]:
array([[ 30, 80, 130],
[ 80, 255, 430],
[130, 430, 730]])
- 排序
In [40]: arr = randn(8)
In [41]: arr
Out[41]:
array([-0.04165555, -0.58147668, -0.1026614 , -2.00641289, -0.94810499,
0.68015849, -0.94358531, -0.12948516])
In [42]: arr.sort()
In [43]: arr
Out[43]:
array([-2.00641289, -0.94810499, -0.94358531, -0.58147668, -0.12948516,
-0.1026614 , -0.04165555, 0.68015849])
In [44]: arr = randn(3,4)
In [45]: arr
Out[45]:
array([[-0.31807417, -0.12209285, -0.35218604, 1.86467014],
[-0.87586945, 0.48491914, 0.02919893, -0.89746354],
[ 0.75919047, 0.61933593, 0.22276992, -0.63860342]])
# 沿1轴方向上的排序(行方向,也是sort默认方向)
In [46]: arr.sort(axis=1)
In [47]: arr
Out[47]:
array([[-0.35218604, -0.31807417, -0.12209285, 1.86467014],
[-0.89746354, -0.87586945, 0.02919893, 0.48491914],
[-0.63860342, 0.22276992, 0.61933593, 0.75919047]])
- 统计
# 创建一个三维矩阵
In [15]: arr = np.random.randint(0,9,[2,3,3])
In [16]: arr
Out[16]:
array([[[7, 0, 4],
[3, 1, 7],
[3, 8, 1]],
[[2, 3, 5],
[0, 3, 4],
[2, 6, 7]]])
# 0轴上相加,也就是平面相加,结果仍然是一个平面
In [17]: arr.sum(axis=0)
Out[17]:
array([[ 9, 3, 9],
[ 3, 4, 11],
[ 5, 14, 8]])
# 1轴上相加,也就是各平面上沿着列方向相加
In [18]: arr.sum(axis=1)
Out[18]:
array([[13, 9, 12],
[ 4, 12, 16]])
# 2轴上相加,也就是各平面上沿着行方向相加
In [19]: arr.sum(axis=2)
Out[19]:
array([[11, 11, 12],
[10, 7, 15]])
注:数学统计函数:
sum
mean
std/var # 标准差/方差
min/max
argmin/argmax # 最小和最大元素的下标索引