NumPy是一个强大的Python库,专门用于处理数组和矩阵运算。它不仅提供了线性代数、傅里叶变换和矩阵运算的功能,还因其高效的计算性能和广泛的社区支持而广受欢迎。NumPy最初由Travis Oliphant在2005年创建,作为一个开源项目,它吸引了成千上万的贡献者,不断优化和更新,以保持其快速、友好和无bug。
NumPy的核心优势在于其数组操作的速度。与Python原生列表相比,NumPy数组在执行计算时速度更快,这是因为NumPy的底层实现使用了C或C++。此外,NumPy的开源特性意味着任何人都可以免费使用它,并为其发展做出贡献。
NumPy的应用非常广泛,从基本的算术和统计操作到复杂的三角函数计算,再到广播、线性代数、矩阵操作、数组堆叠、复制和操作,NumPy都能轻松应对。它包含多维数组和矩阵数据结构,使得大规模计算变得简单易行。
NumPy还包含了随机数生成器,可以用于信号噪声生成、随机概率生成等数学任务。以下是NumPy的一些基础用法:
import numpy as np
# 创建一个NumPy数组
a = np.array([34, 67, 8, 5, 33, 90, 23])
print(a) # 输出: [34 67 8 5 33 90 23]
# 查看数组类型
print(type(a)) # 输出: <class 'numpy.ndarray'>
# 访问数组元素
print(a[2]) # 输出: 8
# 创建二维数组
b = np.array([[77, 38, 9], [10, 11, 12]])
print(b)
# 输出:
# [[77 38 9]
# [10 11 12]]
NumPy提供了许多内置函数来创建和操作数组。例如:
# 创建全1数组
np.ones(5) # 输出: [1. 1. 1. 1. 1.]
np.ones([6, 7]) # 输出: 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., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1., 1.],
# [1., 1., 1., 1., 1., 1., 1.]])
# 创建全0数组
np.zeros(7) # 输出: [0. 0. 0. 0. 0. 0. 0.]
NumPy的eye函数可以创建一个对角线上为1,其余位置为0的二维数组:
np.eye(5) # 输出:
# array([[1., 0., 0., 0., 0.],
# [0., 1., 0., 0., 0.],
# [0., 0., 1., 0., 0.],
# [0., 0., 0., 1., 0.],
# [0., 0., 0., 0., 1.]])
diag函数则可以根据给定的数组创建一个对角矩阵:
y = np.array([6, 78, 3, 56, 89])
np.diag(y) # 输出:
# array([[ 6, 0, 0, 0, 0],
# [ 0, 78, 0, 0, 0],
# [ 0, 0, 3, 0, 0],
# [ 0, 0, 0, 56, 0],
# [ 0, 0, 0, 0, 89]])
NumPy还提供了许多其他有趣的函数,例如:
# 重复数组元素
np.array([1, 2, 3, 7] * 3) # 输出: [1 2 3 7 1 2 3 7 1 2 3 7]
np.repeat([1, 4, 2, 3], 5) # 输出: [1 1 1 1 1 4 4 4 4 4 2 2 2 2 2 3 3 3 3 3]
# 创建全1的二维数组
p = np.ones([2, 3], int)
print(p) # 输出:
# [[1 1 1]
# [1 1 1]]
使用vstack()和hstack()函数,可以分别垂直和水平地堆叠数组:
np.vstack([p, 2*p]) # 输出:
# array([[1, 1, 1],
# [1, 1, 1],
# [2, 2, 2],
# [2, 2, 2]])
np.vstack([3*p, 2*p, 6.5*p, 4.6*p]) # 输出:
# array([[3., 3., 3.],
# [3., 3., 3.],
# [2., 2., 2.],
# [2., 2., 2.],
# [6.5, 6.5, 6.5],
# [6.5, 6.5, 6.5],
# [4.6, 4.6, 4.6],
# [4.6, 4.6, 4.6]])
np.hstack([2*p, 5.5*p, 9*p]) # 输出:
# array([[2., 2., 2., 5.5, 5.5, 5.5, 9., 9., 9.],
# [2., 2., 2., 5.5, 5.5, 5.5, 9., 9., 9.]])
在数学计算方面,NumPy提供了丰富的功能。以下是一些基本的数学运算示例:
import numpy as np
a = np.array([4, 6, 8])
b = np.array([8, 9, 7])
# 数组相加
c = a + b
print(c) # 输出: [12 15 15]
# 元素逐个相乘
c = a * b
print(c) # 输出: [32 54 56]
# 元素逐个相除
c = a / b
print(c) # 输出: [0.5 0.66666667 1.14285714]
# 计算点积
c = np.array([6, 7, 5, 8])
d = np.array([4, 3, 7, 8])
ans = c.dot(d) # 点积
print(ans) # 输出: 144
NumPy还支持多维数组的创建和操作。以下是创建和转置多维数组的示例:
z = np.array([[5, 7, 5, 4, 5], [6, 2, 3, 4, 6]])
print(z)
# 输出:
# [[5 7 5 4 5]
# [6 2 3 4 6]]
# 获取转置
print(z.T)
# 输出:
# [[5 6]
# [7 2]
# [5 3]
# [4 4]
# [5 6]]
h = np.arange(4, 90, 5)
print(h)
# 输出: [ 4 9 14 19 24 29 34 39 44 49 54 59 64 69 74 79 84 89]
test = np.random.randint(0, 10, (4, 3))
print(test)
# 输出:
# [[5 0 2]
# [3 6 0]
# [5 7 7]
# [0 5 9]]
test2 = np.random.randint(90, 120, (8, 3))
print(test2)
# 输出:
# array([[106, 103, 104],
# [ 96, 93, 106],
# [110, 108, 115],
# [117, 106, 114],
# [ 91, 102, 103],
# [ 98, 104, 92],
# [112, 99, 105],
# [115, 111, 118]])
for row in test2:
print(row)
test3 = test2 ** 2
print(test3)
# 输出:
# array([[11236, 10609, 10816],
# [ 9216, 8649, 11236],
# [12100, 11664, 13225],
# [13689, 11236, 12996],
# [ 8281, 10404, 10609],
# [ 9604, 10816, 8464],
# [12544, 9801, 11025],
# [13225, 12321, 13924]], dtype=int32)
for i, j in zip(test2, test3):
print(i, '+', j, '=', i+j)