Numpy介绍
numpy支持大量高维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
知识点
- 创建数组
- 数组运算
- 数学函数
- 数组的切片和索引
- 数组形状操作
- 数组排序
- 数组统计
基础操作
1.查看Numpy版本号
print(np.__version__)
2.创建数组
NumPy 的主要对象是多维数组 Ndarray。在 NumPy 中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。例如,下方数组是一个秩为 1 的数组,因为它只有一个轴 (行),而轴的长度为 3。
[1,2,3]
又例如,下方数组的秩为2 (一行和一列)。第一个维度长度为2 (行) ,第二个维度长度为 3 (列)。
[[1., 2., 3.],
[4., 5., 6.]]
2.1 通过列表创建一维数组
注意:numpy.array 和 Python 标准库 array.array 并不相同,前者更为强大,这也就是我们学习 Numpy 的重要原因之一。
输入:
np.array([1, 2, 3])
输出:
array([1, 2, 3])
2.2 通过列表创建二维数组
输入:
np.array([(1, 2, 3), (4, 5, 6)]) #注意这里的是(1, 2, 3), (4, 5, 6),不要忘记括号!
输出:
array([[1, 2, 3],
[4, 5, 6]])
2.3 创建全为0的二维数组
输入:
np.zeros((3, 3))
输出:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
2.4 创建全为 1 的三维数组(好好理解)
输入:
np.ones((2, 3, 4))
输出:
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])
2.5 创建一维等差数组
输入:
np.arange(5)
输出:
array([0, 1, 2, 3, 4])
2.6创建二维等差数组
输入:
np.arange(6).reshape(2, 3)
.reshape(2, 3) 把一维数组变成两行三列
输出:
array([[0, 1, 2],
[3, 4, 5]])
2.7 创建单位矩阵
输入:
np.eye(3)
输出:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
2.8 创建间隔一维数组
输入:
np.linspace(1, 10, num=6)
输出:
array([ 1. , 2.8, 4.6, 6.4, 8.2, 10. ])
2.9创建二维随机数组
输入:
np.random.rand(2, 3) #两行三列
输出:
array([[0.50122984, 0.98824375, 0.81388012],
[0.60951775, 0.02055326, 0.97622093]])
2.10 创建二维随机整数数组(数值小于 5)
输入:
np.random.randint(5, size=(2, 3))
输出:
array([[2, 0, 2],
[4, 4, 4]])
2.11 依据自定义函数创建数组
输入:
np.fromfunction(lambda i, j: i + j, (3, 3)) # i,j都是从0开始
输出:
array([[0., 1., 2.],
[1., 2., 3.],
[2., 3., 4.]])
3.数组运算
3.1 一维数组的四则运算
生成一维示例数组:
输入:
a = np.array([10, 20, 30, 40, 50])
b = np.arange(1, 6)
a, b
输出:
(array([10, 20, 30, 40, 50]), array([1, 2, 3, 4, 5]))
输入:
a + b
a - b
a * b
a / b
输出:
array([11, 22, 33, 44, 55])
array([ 9, 18, 27, 36, 45])
array([ 10, 40, 90, 160, 250])
array([10., 10., 10., 10., 10.])
3.2 二维数组(矩阵)运算
生成二维示例数组(可以看作矩阵)
输入:
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
A, B
输出:
(array([[1, 2],
[3, 4]]), array([[5, 6],
[7, 8]]))
3.2.1矩阵的加减法
输入:
A + B
A - B
输出:
array([[ 6, 8],
[10, 12]])
array([[-4, -4],
[-4, -4]])
3.2.2 矩阵==元素间==乘法运算
输入:
A * B
输出:
array([[ 5, 12],
[21, 32]])
3.2.3 矩阵==乘法==运算(注意与上题的区别)
输入:
np.dot(A, B)
输出:
array([[19, 22],
[43, 50]])
如果使用 np.mat 将二维数组准确定义为矩阵,就可以直接使用 * 完成矩阵乘法计算。
输入:
np.mat(A) * np.mat(B)
输出:
matrix([[19, 22],
[43, 50]])
3.2.3 矩阵的数乘
输入:
2 * A
输出:
array([[2, 4],
[6, 8]])
3.3矩阵的转置、求逆
输入:
A.T
输出:
array([[1, 3],
[2, 4]])
输入:
np.linalg.inv(A)
输出:
array([[-2. , 1. ],
[ 1.5, -0.5]])
4.数学函数
4.1三角函数
输入:
print(a)
np.sin(a)
输出:
[10 20 30 40 50]
array([-0.54402111, 0.91294525, -0.98803162, 0.74511316, -0.26237485])
4.2以自然对数函数为底数的指数函数
输入:
np.exp(a)
输出:
array([2.20264658e+04, 4.85165195e+08, 1.06864746e+13, 2.35385267e+17,
5.18470553e+21])
4.3 数组的方根的运算(开平方)
输入:
np.sqrt(a)
输出:
array([3.16227766, 4.47213595, 5.47722558, 6.32455532, 7.07106781])
4.4 数组的方根的运算(立方)
输入:
np.power(a, 3)
输出:
array([ 1000, 8000, 27000, 64000, 125000])
5.数组的切片和索引
5.1 一维数组的索引
输入:
a = np.array([1, 2, 3, 4, 5])
a[0], a[-1]
输出:
(1, 5)
索引出来成元组形式了
5.2 一维数组的切片
输入:
a[0:2], a[:-1]
输出:
(array([1, 2]), array([1, 2, 3, 4]))
5.3 二维数组索引(对行进行索引)
输入:
a = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
a[0], a[-1]
输出:
(array([1, 2, 3]), array([7, 8, 9]))
二维数组的单个索引是索引的行
5.4 二维数组切片(取出第2列)
输入:
print(a)
a[:, 1]
输出:
[[1 2 3]
[4 5 6]
[7 8 9]]
array([2, 5, 8])
操作数==行在前、列在后==
5.5 二维数组切片(取出第2,3行)
输入:
a[1:3, :]
输出:
array([[4, 5, 6],
[7, 8, 9]])
操作数==行在前、列在后==,切片符号‘:’
6.数组形状操作
生成二维示例数组
输入:
a = np.random.random((3, 2))
a
输出:
array([[0.04350254, 0.71580656],
[0.52073605, 0.70767743],
[0.60271726, 0.42957689]])
np.random.random( (x,y) ) 表示生成x行,y列范围在0~1之间的随机数矩阵。
link
6.1 查看数组形状
输入:
a.shape
输出:
(3, 2)
6.2 输出改变的数组形状(不改变原始数组)
输入:
a
a.reshape(2, 3)
==reshape== 并不改变原始数组
输出:
[[0.04350254 0.71580656]
[0.52073605 0.70767743]
[0.60271726 0.42957689]]
array([[0.04350254, 0.71580656, 0.52073605],
[0.70767743, 0.60271726, 0.42957689]])
注意reshape改变数组形状的补齐方式
6.3 更改数组形状(改变原始数组)
输入:
a.resize(2, 3)
a
输出:
array([[0.04350254, 0.71580656, 0.52073605],
[0.70767743, 0.60271726, 0.42957689]])
6.3 展平数组
输入:
a.ravel()
输出:
array([0.04350254, 0.71580656, 0.52073605, 0.70767743, 0.60271726,
0.42957689])
7.拼接拆分数组
生成示例数组
输入:
a = np.random.randint(10, size=(3, 3))
b = np.random.randint(10, size=(3, 3))
a, b
输出:
(array([[8, 6, 4],
[0, 0, 4],
[6, 5, 4]]),
array([[2, 7, 1],
[3, 8, 2],
[7, 8, 4]]))
np.random.randint(n,size=(x,y)) 表示生成x行y列范围在0~n之间的随机整数。
7.1 垂直拼合数组
输入:
np.vstack((a, b))
输出:
array([[8, 6, 4],
[0, 0, 4],
[6, 5, 4],
[2, 7, 1],
[3, 8, 2],
[7, 8, 4]])
7.2 水平拼合数组
输入:
np.hstack((a, b))
输出:
array([[8, 6, 4, 2, 7, 1],
[0, 0, 4, 3, 8, 2],
[6, 5, 4, 7, 8, 4]])
7.3 沿纵轴分割数组
输入:
np.vsplit(a, 3)
输出:
[array([[8, 6, 4]]), array([[0, 0, 4]]), array([[6, 5, 4]])]
按行分割
7.4 沿横轴分割数组
输入:
np.hsplit(a, 3)
输出:
[array([[8],
[0],
[6]]), array([[6],
[0],
[5]]), array([[4],
[4],
[4]])]
按列分割
8.数组排序
生成示例数组
输入:
a = np.array(([1, 4, 3], [6, 2, 9], [4, 7, 2]))
a
输出:
array([[1, 4, 3],
[6, 2, 9],
[4, 7, 2]])
8.1 返回每列最大值
输入:
np.max(a, axis=0)
输出:
array([6, 7, 9])
axis=0 表示对列进行操作
8.2 返回每行最小值
输入:
np.min(a, axis=1)
输出:
array([1, 2, 2])
axis=1 表示对行进行操作
8.3 返回每列最大值索引
输入:
np.argmax(a, axis=0)
输出:
array([1, 2, 1])
8.4 返回每行最小值索引
输入:
np.argmin(a, axis=1)
输出:
array([0, 1, 2])
9.数组统计
示例数组:
array([[1, 4, 3],
[6, 2, 9],
[4, 7, 2]])
9.1 统计数组各列的中位数
输入:
np.median(a, axis=0)
输出:
array([4., 4., 3.])
9.2 统计数组各行的==算术平均值==
输入:
np.mean(a, axis=1)
输出:
array([2.66666667, 5.66666667, 4.33333333])
9.3 统计数组各列的==加权平均值==
输入:
np.average(a, axis=0)
输出:
array([3.66666667, 4.33333333, 4.66666667])
9.4 统计数组各行的方差
输入:
np.var(a, axis=1)
输出:
array([1.55555556, 8.22222222, 4.22222222])
9.5 统计数组各列的标准偏差
输入:
np.std(a, axis=0)
输入:
array([2.05480467, 2.05480467, 3.09120617])
高阶操作
10.按需创建数组
10.1 创建一个 5×5 的二维数组,其中边界值为1,其余值为0
输入:
Z = np.ones((5,5))
Z[1:-1,1:-1] = 0
Z
输出:
array([[1., 1., 1., 1., 1.],
[1., 0., 0., 0., 1.],
[1., 0., 0., 0., 1.],
[1., 0., 0., 0., 1.],
[1., 1., 1., 1., 1.]])
Z[1:-1,1:-1] = 0 分别对行和列进行重新赋值。
10.2使用数字 0 将一个全为 1 的 5×5 二维数组包围
输入:
Z = np.ones((5,5))
Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)
Z
输出:
array([[0., 0., 0., 0., 0., 0., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 1., 1., 1., 0.],
[0., 0., 0., 0., 0., 0., 0.]])
注意np.pad的使用方法 CSDN
10.3 创建一个 5×5 的二维数组,并设置值 1, 2, 3, 4 落在其对角线下方
输入:
Z = np.diag(1+np.arange(4),k=-1)
Z
输出:
array([[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0]])
10.4 创建一个 10×10 的二维数组,并使得 1 和 0 沿对角线间隔放置
输入:
Z = np.zeros((10,10),dtype=int)
Z[1::2,::2] = 1
Z[::2,1::2] = 1
Z
输出:
array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])
注意这里对行列的交替赋值
10.5 创建一个 0-10 的一维数组,并将 (1, 9] 之间的数全部反转成负数
输入:
Z = np.arange(11)
Z[(1 < Z) & (Z <= 9)] *= -1
Z
输出:
array([ 0, 1, -2, -3, -4, -5, -6, -7, -8, -9, 10])
10.6 找出两个一维数组中相同的元素
输入:
Z1 = np.random.randint(0,10,10)
Z2 = np.random.randint(0,10,10)
print("Z1:", Z1)
print("Z2:", Z2)
np.intersect1d(Z1,Z2)
输出:
Z1: [7 5 6 8 2 7 3 4 0 4]
Z2: [9 4 9 2 1 0 0 0 4 7]
array([0, 2, 4, 7])
10.7 使用 NumPy 打印昨天、今天、明天的日期
输入:
yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')
today = np.datetime64('today', 'D')
tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D')
print("yesterday: ", yesterday)
print("today: ", today)
print("tomorrow: ", tomorrow)
输出:
yesterday: 2018-11-28
today: 2018-11-29
tomorrow: 2018-11-30
发表回复