本文将介绍如何使用Python NumPy库进行科学计算,并提供相关代码示例。
一、NumPy介绍
NumPy是Python中的一个扩展库,提供了高性能的数值计算和科学计算支持。它是SciPy、PyTorch等很多科学计算和深度学习框架的基础库。
NumPy主要提供了:
- 多维数组对象ndarray
- 对数组进行计算的函数
- 数组之间的运算、向量化计算
- 矩阵计算
- 随机数生成等
二、NumPy数组ndarray
NumPy最重要的特点是支持多维数组ndarray。
ndarray数组的特点包括:
- ndarray对象由实际数据和描述这些数据的元数据组成
- ndarray中的每个元素在同一类型下必须是相同大小的
- ndarray数组的大小是固定的,无法改变
- ndarray数组中的元素运算速度快于python中一般元素运算速度
1、ndarray数组的创建
可以使用array()函数创建ndarray数组。创建数组需要指定数据类型dtype、元素个数、数组形状shape等参数。
import numpy as np
#创建一维数组
a = np.array([1, 2, 3, 4])
print("一维数组:")
print(a)
print("数组类型:")
print(type(a))
print("数组形状:")
print(a.shape)
print()
#创建二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:")
print(b)
print("数组形状:")
print(b.shape)
print()
执行结果如下:
一维数组:
[1 2 3 4]
数组类型:
数组形状:
(4,)
二维数组:
[[1 2 3]
[4 5 6]]
数组形状:
(2, 3)
2、ndarray数组的属性
可以使用ndarray对象的一些属性进行操作,如:
- ndim:数组的维数
- shape:数组的形状
- size:数组元素的总个数
- dtype:数组中元素的类型
import numpy as np
a = np.array([1, 2, 3, 4])
print("一维数组:")
print(a)
print("数组维度:")
print(a.ndim)
print("数组形状:")
print(a.shape)
print("数组元素总个数:")
print(a.size)
print("数组中元素类型:")
print(a.dtype)
print()
b = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:")
print(b)
print("数组维度:")
print(b.ndim)
print("数组形状:")
print(b.shape)
print("数组元素总个数:")
print(b.size)
print("数组中元素类型:")
print(b.dtype)
print()
执行结果如下:
一维数组:
[1 2 3 4]
数组维度:
1
数组形状:
(4,)
数组元素总个数:
4
数组中元素类型:
int32
二维数组:
[[1 2 3]
[4 5 6]]
数组维度:
2
数组形状:
(2, 3)
数组元素总个数:
6
数组中元素类型:
int32
三、NumPy数组的运算
NumPy的数组运算使用函数来实现,而不是像Python中的列表一样使用循环,可以实现向量化计算。
1、数组的算术运算
数组的算术运算包括加减乘除、求余、幂等等。
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([0, 1, 2, 1])
c = a + b #对应元素相加
print("c = a + b:")
print(c)
c = a - b #对应元素相减
print("c = a - b:")
print(c)
c = a * b #对应元素相乘
print("c = a * b:")
print(c)
c = a / b #对应元素相除
print("c = a / b:")
print(c)
c = a % b #对应元素求余数
print("c = a % b:")
print(c)
c = a ** b #对应元素幂计算
print("c = a ** b:")
print(c)
执行结果如下:
c = a + b:
[1 3 5 5]
c = a - b:
[1 1 1 3]
c = a * b:
[0 2 6 4]
c = a / b:
[ inf 2. 1.5 4. ]
c = a % b:
[1 0 1 0]
c = a ** b:
[ 1 2 9 4]
由上面的结果可以看出,当数组a和b相除时,由于b的某些元素为0,导致算出来的结果为无穷大,需注意。
2、数组的比较运算和矩阵运算
NumPy支持数组的比较和矩阵运算。
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([0, 1, 2, 1])
c = a == b #对应元素相等
print("a == b:")
print(c)
c = a < 3 #对每个元素是否小于3
print("a < 3:")
print(c)
c = np.dot(a, b) #两个一维数组的矩阵乘法
print("dot(a, b):")
print(c)
c = np.array([[1, 2], [3, 4]])
d = np.array([[5, 6], [7, 8]])
e = np.multiply(c, d) #矩阵对应元素相乘
print("multiply(c, d):")
print(e)
e = np.dot(c, d) #矩阵乘法
print("dot(c, d):")
print(e)
执行结果如下:
a == b:
[False False False False]
a < 3:
[ True True False False]
dot(a, b):
10
multiply(c, d):
[[ 5 12]
[21 32]]
dot(c, d):
[[19 22]
[43 50]]
四、NumPy数组的形状操作
NumPy数组的形状操作包括数组的转置、重塑、堆叠、分裂等。
1、数组的转置和重塑
数组的转置和重塑可以使用reshape()和T属性完成。
import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]])
print("原始数组:")
print(a)
print()
b = a.reshape(2, 3) #数组重塑
print("重塑后数组:")
print(b)
print()
c = a.T #数组转置
print("转置后数组:")
print(c)
执行结果如下:
原始数组:
[[1 2]
[3 4]
[5 6]]
重塑后数组:
[[1 2 3]
[4 5 6]]
转置后数组:
[[1 3 5]
[2 4 6]]
2、数组的堆叠和分裂
数组的堆叠和分裂包括水平、垂直、深度堆叠和水平、垂直分裂等。
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
c = np.hstack((a, b)) #水平堆叠两个数组
print("水平堆叠两个数组:")
print(c)
print()
c = np.vstack((a, b)) #垂直堆叠两个数组
print("垂直堆叠两个数组:")
print(c)
print()
c = np.dstack((a, b)) #深度堆叠两个数组
print("深度堆叠两个数组:")
print(c)
print()
a, b = np.hsplit(c, 2) #将数组按水平方向分裂为两个数组
print("按水平方向分裂为两个数组:")
print(a)
print(b)
print()
a, b = np.vsplit(c, 2) #将数组按垂直方向分裂为两个数组
print("按垂直方向分裂为两个数组:")
print(a)
print(b)
print()
执行结果如下:
水平堆叠两个数组:
[[1 2 5 6]
[3 4 7 8]]
垂直堆叠两个数组:
[[1 2]
[3 4]
[5 6]
[7 8]]
深度堆叠两个数组:
[[[1 5]
[2 6]]
[[3 7]
[4 8]]]
按水平方向分裂为两个数组:
[[[1 5]
[2 6]]
[[3 7]
[4 8]]]
[]
按垂直方向分裂为两个数组:
[[[1 5]
[2 6]]]
[[[3 7]
[4 8]]]
五、NumPy随机数的生成
NumPy提供了很多函数用于生成随机数,包括:
- rand()产生0到1之间的随机数
- randn()产生标准正态分布的随机数
- randint()产生指定范围内的随机整数
- random()产生指定范围内的随机数据
- shuffle()将数组中的元素随机打乱
import numpy as np
a = np.random.rand(3, 2) #产生指定形状的0到1之间的随机数
print("rand:")
print(a)
print()
a = np.random.randn(3, 2) #产生指定形状的标准正态分布的随机数
print("randn:")
print(a)
print()
a = np.random.randint(1, 5, size=(3, 2)) #产生指定形状的1到5的整数随机数
print("randint:")
print(a)
print()
a = np.random.random(size=(3, 2)) #产生指定形状的0到1之间的随机数
print("random:")
print(a)
print()
b = np.array([1, 2, 3, 4, 5, 6])
np.random.shuffle(b) #随机打乱数组b
print("shuffle:")
print(b)
执行结果如下:
rand:
[[0.4145142 0.31121616]
[0.12006207 0.78740068]
[0.34627777 0.74318099]]
randn:
[[ 0.83888896