一、数组
Numpy中的核心数据结构是ndarray(N-dimensional array,多维数组),它是一个有相同数据类型元素的固定大小的数组。相比于Python原生的列表,ndarray在内存中存储时更加紧凑和高效,支持向量化运算,使得元素之间的数学运算更加方便。
1.数组的创建与索引
import numpy as np
a = np.array([1, 2, 3]) # 创建一维数组
print(a) # [1 2 3]
print(a[0]) # 1
b = np.array([[1, 2, 3], [4, 5, 6]]) # 创建二维数组
print(b)
# [[1 2 3]
# [4 5 6]]
print(b[0, 1]) # 2
2.数组的操作
Numpy提供了丰富的数组操作函数,包括常用的数学运算、统计函数、数组转置、变形、拼接、切片等。
a = np.array([1, 2, 3])
print(np.exp(a)) # [ 2.71828183 7.3890561 20.08553692]
print(np.sum(a)) # 6
print(np.mean(a)) # 2.0
print(np.reshape(a, (3, 1)))
# [[1]
# [2]
# [3]]
二、随机数
Numpy中的random模块提供了各种生成随机数的函数,包括正态分布、均匀分布、幂律分布等,可以用于模拟实验、算法测试等场合。
1.生成随机数
import numpy as np
a = np.random.normal(loc=0.0, scale=1.0, size=(2, 3)) # 生成标准正态分布随机数
print(a)
# [[-1.22553125 0.46581273 0.69259882]
# [-0.86993335 0.53642977 -0.83448222]]
b = np.random.randint(low=0, high=10, size=(2, 3)) # 生成0~9之间的随机整数
print(b)
# [[6 7 5]
# [5 4 6]]
2.随机数种子
通过设置随机数种子可以使得每次生成的随机数序列都相同,这在实验重现和调试中非常有用,可以保证程序的可复现性。
import numpy as np
np.random.seed(0)
a = np.random.randint(low=0, high=10, size=(2, 3)) # 设置随机数种子
print(a)
# [[5 0 3]
# [3 7 9]]
np.random.seed(0)
b = np.random.randint(low=0, high=10, size=(2, 3))
print(b)
# [[5 0 3]
# [3 7 9]]
三、线性代数
Numpy中的linalg模块提供了各种线性代数运算函数,包括矩阵乘法、逆、特征值、奇异值等,可以用于解线性方程组、特征分解、主成分分析等任务。
1.矩阵运算
import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(np.dot(a, b)) # 矩阵乘法
# [[19 22]
# [43 50]]
print(np.linalg.inv(a)) # 矩阵的逆
# [[-2. 1. ]
# [ 1.5 -0.5]]
eigenvalues, eigenvectors = np.linalg.eig(a) # 矩阵的特征值和特征向量
print(eigenvalues) # [-0.37228132 5.37228132]
print(eigenvectors)
# [[-0.82456484 -0.41597356]
# [ 0.56576746 -0.90937671]]
2.线性方程组解
使用numpy.linalg.solve函数可以求解形如Ax = b的线性方程组。
A = np.array([[1, 2], [3, 4]])
b = np.array([1, 2])
x = np.linalg.solve(A, b)
print(x) # [-0.5 1. ]
四、文件操作
numpy提供了方便的对二进制文件、csv文件和文本文件等常见格式的读写函数。
1.二进制文件
a = np.array([1, 2, 3])
np.save("a.npy", a) # 保存为二进制文件
b = np.load("a.npy") # 从二进制文件读取
print(b) # [1 2 3]
2.csv文件
a = np.array([[1, 2], [3, 4]])
np.savetxt("a.csv", a, delimiter=",") # 保存为csv文件
b = np.loadtxt("a.csv", delimiter=",") # 从csv文件读取
print(b)
# [[1. 2.]
# [3. 4.]]
3.文本文件
a = np.array([1, 2, 3])
np.savetxt("a.txt", a, fmt="%d") # 保存为文本文件
b = np.loadtxt("a.txt", dtype=np.int) # 从文本文件读取
print(b) # [1 2 3]
五、性能优化
Numpy中的广播(broadcasting)机制和向量化运算是提高程序性能的关键。如果使用正确,可以使得程序在数组操作时避免使用循环,从而提高了运行效率。
1.广播
Numpy中的广播机制可以自动将不同形状的数组转换为相同形状,从而使得它们可以参与元素级别的运算。
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])
print(a + b)
# [[11 22]
# [13 24]]
2.向量化运算
使用numpy的向量化运算可以使得程序更加简洁、易读、易维护。
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.zeros(3)
for i in range(3):
c[i] = a[i] + b[i] # 使用循环
print(c) # [5. 7. 9.]
c = a + b # 使用向量化运算
print(c) # [5 7 9]
六、总结
Numpy模块是Python中非常重要的数值计算库,支持高维数组和矩阵运算,提供了丰富的数学库函数和文件操作函数。在数据科学和机器学习等领域中,常常需要使用numpy模块来进行数据处理和建模。本文从数组、随机数、线性代数、文件操作和性能优化等多个方面对numpy模块进行了详细的阐述,希望读者们通过本文的学习可以对numpy模块有更深入的理解。