Python编程深度学习计算库之numpy
在Python编程中,NumPy是一个非常重要的科学计算库,它提供了许多高效的数值计算工具。本攻略将详细介绍Python NumPy的使用方法,包括NumPy数组、数组的属性和方法、数组的索引和切片、数组的运算、数组的广播、数组的拼接和分裂、随机数生成等。
导入NumPy模块
在使用NumPy模块之前,需要先导入它。可以以下命令在Python脚本中导入NumPy模块:
import numpy as np
在上面的示例中我们使用import
关键字导入了NumPy模块,并将其重命名为np
,以便在代码中更方便地使用。
NumPy数组
NumPy数组是NumPy中的一个重要的数据结构,它是一个多维数组,可以存储相同类型的元素。可以使用以下方法创建NumPy数组:
1. 使用np.array()
函数创建
可以使用np.array()
函数创建一个NumPy数组,例如:
import numpy as np
# 创建一个一维数组
a = np.array([1, 2, 3])
# 创建一个二维数组
b = np.array([[1, 2], [3, 4]])
# 创建一个三维数组
c = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
在上面的示例中,我们分别使用np.array()
函数创建了一个一维数组a
、一个二维数组b
和一个三维数组c
。
2. 使用np.zeros()
函数创建
可以使用np.zeros()
函数创建一个全为0的NumPy数组,例如:
import numpy as np
# 创建一个一维数组
a = np.zeros(3)
# 创建一个二维数组
b = np.zeros((2, 2))
# 创建一个三维数组
c = np.zeros((2, 2, 2))
在上面的示例中,我们分别使用np.zeros()
函数创建了一个一维数组a
、一个二维数组b
和一个三维数组c
。
3. 使用np.ones()
函数创建
可以使用np.ones()
函数创建一个全为1的NumPy数组,例如:
import numpy as np
# 创建一个一维数组
a = np.ones(3)
# 创建一个二维数组
b = np.ones((2, 2))
# 创建一个三维数组
c = np.ones((2, 2, 2))
在上面的示例中,我们分别使用np.ones()
函数创建了一个一维数组a
、一个二维数组b
和一个三维数组c
。
4. 使用np.arange()
函数创建
可以使用np.arange()
函数创建一个等差数列的NumPy数组,例如:
import numpy as np
# 创建一个一维数组
a = np.arange(1, 4)
# 创建一个二维数组
b = np.arange(1, 5).reshape(2, 2)
# 创建一个三维数组
c = np.arange(1, 9).reshape(2, 2, 2)
在上面的示例中,我们分别使用np.arange()
函数创建了一个一维数组a
、一个二维数组b
和一个三维数组c
。
数组的属性和方法
NumPy数组有以下一些重要的属性:
1. array.shape
shape
属性返回一个元组,表示数组的形状,例如:
import numpy as np
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])
# 打印形状
print(a.shape)
在上面的示例中,我们先使用np.array()
函数创建了一个二维数组a
,并将结果保存在变量a
中。接着,使用shape
属性打印出了数组形状。
输出为:
(2, 2)
2. array.ndim
ndim
属性返回一个整数,表示数组的维度,例如:
import numpy as np
# 创建一个三维数组
a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 打印维度
print(a.ndim)
在上面的示例中,我们首先使用np.array()
函数创建了一个三维数组a
,并将结果保存在变量a
中。接着,使用ndim
属性打印出了数组的维度。
结果为:
3
3. array.size
size
属性返回一个整数,表示数组中元素的总数,例如:
import numpy as np
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])
# 打印元素总数
print(a.size)
在上面的示例中,我们首先使用np.array()
函数创建了一个二维数组a
,并将结果保存在变量a
中。接着,使用size
属性打印出了数组中元素的总数。
输出结果为:
4
NumPy数组有以下一些重要的方法:
1. array.reshape()
reshape()
方法可以改变数组的形状,例如:
import numpy as np
# 创建一个一维数组
a = np.array([1, 2, 3, 4])
# 改变形状为二维数组
b = a.reshape(2, 2)
# 打印结果
print(b)
在上面的示例中,我们首先使用np.array()
函数创建了一个一维数组a
,并将结果保存在变量a
中。接着,使用reshape()
方法将数组形状改变为二维数组,并将结果保存在变量b
中。最后,使用print()
函数打印出了结果。
输出结果为:
[[1 2]
[3 4]]
2. array.flatten()
flatten()
方法可以将多维数组转换为一维数组,例如:
import numpy as np
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])
# 转换为一维数组
b = a.flatten()
# 打印结果
print(b)
在上面的示例中,我们首先使用np.array()
函数创建了一个二维数组a
,并将结果保存在变量a
中。接着,使用flatten()
方法将数组转换为一维数组,并将结果保存在变量b
中。最后,使用print()
函数打印出了结果。
输出结果为:
[1 2 3 4]
3. array.transpose()
transpose()
方法可以返回数组的转置数组,例如:
import numpy as np
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])
# 打印转置数组
print(a.transpose())
在上面的示例中,我们首先使用np.array()
函数创建了一个二维数组a
,并将结果保存在变量a
中。接着,使用transpose()
方法打印出了数组的转置数组。
输出为:
[[1 3]
[2 4]]
数组的索引和切片
可以使用以下方法对NumPy数组进行索引和切片:
1. 索引
可以使用[]
运算符对数组进行索引,例如:
import numpy as np
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])
# 索引第一个元素
print(a[0, 0])
# 索引第二行
print(a[1])
# 索引第二列
print(a[:, 1])
在上面的示例中,我们首先使用np.array()
函数创建了一个二维数组a
,并将结果保存在变量a
中。接着,使用[]
运算符对数组进行索引,分别打印出了第一个元素、第二行和第二列。
输出结果为:
1
[3 4]
[2 4]
2. 切片
可以使用:
运算符对数组进行切片,例如:
import numpy as np
# 创建一个二维数组
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 切片第一行和第二行
print(a[0:2, :])
# 切片第一列和第二列
print(a[:, 0:2])
# 切片第一行和第一列
print(a[0:1, 0:1])
在上面的示例中,我们首先使用np.array()
函数创建了一个二维数组a
,并将结果保存在变量a
中。接着,使用:
运算符对数组进行切片,分别打印出了第一行和第二行、第一列和第二列、第一行和第一列。
输出结果为:
[[1 2 3]
[4 5 6]]
[[1 2]
[4 5]
[7 8]]
[[1]]
数组的运算
可以使用以下方法对NumPy数组进行运算:
1. 数组的加减乘除
可以使用+
、-
、*
和/
运算符对数组进行加减乘除,例如:
import numpy as np
# 创建两个二维数组
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 数组的加法
c = a + b
# 数组的减法
d = a - b
# 数组的乘法
e = a * b
# 数组的除法
f = a / b
# 打印结果
print(c)
print(d)
print(e)
print(f)
在上面的示例中,我们首先使用np.array()
函数创建了两个二维数组a
和b
,并将结果保存在变量a
和b
中。接着,使用+
、-
、*
和/
运算符对数组进行加减乘除,将结果分别保存在变量c
、d
、e
和f
中。最后,使用print()
函数打印出了结果。
输出结果为:
[[ 6 8]
[10 12]]
[[-4 -4]
[-4 -4]]
[[ 5 12]
[21 32]]
[[0.2 0.33333333]
[0.42857143 0.5 ]]
2. 数组的矩阵乘法
可以使用@
运算符或np.dot()
函数对数组进行矩阵乘法,例如:
import numpy as np
# 创建两个二维数组
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 数组的矩阵乘法
c = a @ b
d = np.dot(a, b)
# 打印结果
print(c)
print(d)
在上面的示例中,我们首先使用np.array()
函数创建了两个二维数组a
和b
,并将结果保存在变量a
和b
中。接着,使用@
运算符或np.dot()
函数对数组进行矩阵乘法,将结果分别保存在变量c
和d
中。最后,使用print()
函数打印出了结果。
输出结果为:
[[19 22]
[43 50]]
[[19 22]
[43 50]]
数组的广播
NumPy数组的广播是指在进行运算时,如果两个数组的形状不同,NumPy会自动将它们进行扩展,使它们的形状相同,然后再进行运算。例如:
import numpy as np
# 创建一个二维数组
a = np.array([[1, 2], [3, 4]])
# 数组的加法
b = a + 1
# 打印结果
print(b)
在上面的示例中,我们首先使用np.array()
函数创建了一个二维数组a
,并将结果保存在变量a
中。接着,使用+
运算符对数组进行加法运算,将结果保存在变量b
中。由于1是一个标量,NumPy会自动将它扩展为一个与数组a
形状相同的数组,然后再进行运算。
输出结果为:
[[2 3]
[4 5]]
数组的拼接和分裂
可以使用以下方法对NumPy数组进行拼接和分裂:
1. 数组的拼接
可以使用np.concatenate()
函数对数组进行拼接,例如:
import numpy as np
# 创建两个二维数组
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 拼接数组
c = np.concatenate((a, b), axis=0)
d = np.concatenate((a, b), axis=1)
# 打印结果
print(c)
print(d)
在上面的示例中,我们首先使用np.array()
函数创建了两个二维数组a
和b
,并将结果保存在变量a
和b
中。接着,使用np.concatenate()
函数对数组进行拼接,将结果分别保存在变量c
和d
中。最后,使用print()
函数打印出了结果。
输出结果为:
[[1 2]
[3 4]
[5 6]
[7 8]]
[[1 2 5 6]
[3 4 7 8]]
2. 数组的分裂
可以使用np.split()
函数对数组进行分裂,例如:
import numpy as np
# 创建一个一维数组
a = np.array([1, 2, 3, 4, 5, 6])
# 分裂数组
b = np.split(a, 3)
# 打印结果
print(b)
在上面的示例中,我们首先使用np.array()
函数创建了一个一维数组a
,并将结果保存在变量a
中。接着,使用np.split()
函数对数组进行分裂,将结果保存在变量b
中。最后,使用print()
函数打印出了结果。
输出结果为:
[array([1, 2]), array([3, 4]), array([5, 6])]
随机数生成
可以使用np.random
模块生成随机数,例如:
import numpy as np
# 生成一个随机数
a = np.random.rand()
# 生成一个一维数组
b = np.random.rand(3)
# 生成一个二维数组
c = np.random.rand(2, 2)
# 打印结果
print(a)
print(b)
print(c)
在上面的示例中,我们使用np.random.rand()
函数生成了一个随机数、一个一维数组和一个二维数组,并将结果分别保存在变量a
、b
和c
中。最后,使用print()
函数打印出了结果。
输出结果为:
0.401785722045
[ 0.76498687 0.18693622 0.63233698]
[[ 0.76498687 0.18693622]
[ 0.63233698 0.40178572]]
示例一:使用NumPy进行线性回归
下面是一个使用NumPy进行线性回归的示例:
import numpy as np
# 创建一个二维数组
x = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
# 创建一个一维数组
y = np.array([6, 8, 9, 11])
# 计算回归系数
beta = np.linalg.inv(x.T @ x) @ x.T @ y
# 打印结果
print(beta)
在上面的示例中,我们首先使用np.array()
函数创建了一个二维数组x
和一个一维数组y
,并将结果保存在变量x
和y
中。接着,使用NumPy的线性代数函数计算回归系数,并将结果保存在变量beta
中。最后,使用print()
函数打印出了结果。
输出结果为:
[ 3. 2.]
示例二:使用NumPy进行图像处理
下面是一个使用NumPy进行图像处理的示例:
“`