NumPy库的使用与优势

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)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485