NumPy:Python中的强大数学工具
Posted -北天-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NumPy:Python中的强大数学工具相关的知识,希望对你有一定的参考价值。
NumPy:Python中的强大数学工具
文章目录
一、NumPy简介
当谈到数据科学和数值计算时,NumPy是Python编程语言中最重要的软件库之一。NumPy提供了强大的多维数组对象和一系列高效的函数和操作,以便在Python中进行数值计算和科学计算。
NumPy的核心是ndarray,即n-dimensional array,一种用于存储和处理多维数组的数据结构。NumPy中的数组可以包含不同类型的数据,包括整数、浮点数、布尔值和字符串等,这使得NumPy数组非常灵活。
NumPy的另一个关键功能是它提供了许多用于数组操作和计算的函数。例如,可以使用NumPy中的函数进行向量化操作,即对整个数组进行操作,而不是对数组中的每个元素进行单独的操作。这种向量化操作可以大大提高计算速度。
除了基本的数组操作和函数之外,NumPy还提供了许多其他的功能。例如,NumPy中有用于线性代数、随机数生成、傅里叶变换、信号处理和图像处理等领域的函数和类。此外,NumPy还可以与其他Python库和工具集(如Pandas和Matplotlib)集成使用,以便进行更复杂的数据分析和可视化。
总之,NumPy是Python编程语言中最重要的软件库之一,提供了强大的多维数组对象和一系列高效的函数和操作,使得Python成为一种优秀的数值计算和科学计算的工具。
二、创建数组
在NumPy中,有几种方法可以创建数组。以下是其中几种常见的方法:
-
使用numpy.array()函数创建数组:这是一种最基本的创建数组的方法,它接受一个序列(例如Python列表或元组)作为输入,并将其转换为NumPy数组。例如,下面的代码将Python列表转换为NumPy数组:
import numpy as np a = np.array([1, 2, 3, 4, 5]) print(a)
[1 2 3 4 5]
-
使用numpy.zeros()函数创建数组:这个函数创建一个由0组成的数组,并指定数组的形状。例如,下面的代码创建一个形状为(3, 4)的二维数组:
import numpy as np a = np.zeros((3, 4)) print(a)
[[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]]
-
使用numpy.ones()函数创建数组:这个函数创建一个由1组成的数组,并指定数组的形状。例如,下面的代码创建一个形状为(2, 3)的二维数组:
import numpy as np a = np.ones((2, 3)) print(a)
[[1. 1. 1.] [1. 1. 1.]]
-
使用numpy.arange()函数创建数组:这个函数创建一个等差数列,并将其转换为NumPy数组。例如,下面的代码创建一个由1到9的整数组成的数组:
import numpy as np a = np.arange(1, 10) print(a)
[1 2 3 4 5 6 7 8 9]
-
使用numpy.linspace()函数创建数组:这个函数创建一个在指定范围内均匀分布的数组。例如,下面的代码创建一个由0到1之间的5个数字组成的数组:
import numpy as np a = np.linspace(0, 1, 5) print(a)
[0. 0.25 0.5 0.75 1. ]
这些是一些在NumPy中创建数组的常用方法和示例。这些函数提供了许多选项,可以进一步自定义数组的形状、数据类型和其他特性。
三、数组尺寸
在NumPy中,可以使用shape属性获取数组的尺寸,它返回一个表示数组形状的元组,其中元组中的每个值表示该维度的大小。以下是一些示例:
import numpy as np
# 创建一个二维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
# 获取数组的形状
print(a.shape) # 输出 (2, 3)
# 创建一个三维数组
b = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 获取数组的形状
print(b.shape) # 输出 (2, 2, 2)
# 创建一个一维数组
c = np.array([1, 2, 3, 4, 5])
# 获取数组的形状
print(c.shape) # 输出 (5,)
在第一个示例中,我们创建了一个2x3的二维数组,并使用shape属性获取其形状,它返回一个元组(2, 3)。在第二个示例中,我们创建了一个2x2x2的三维数组,并使用shape属性获取其形状,它返回一个元组(2, 2, 2)。在第三个示例中,我们创建了一个包含5个元素的一维数组,并使用shape属性获取其形状,它返回一个元组(5,),这里使用的逗号表示这是一个元组,而不是单个整数。
除了shape属性之外,NumPy还提供了许多其他的属性和方法,用于获取和操作数组的尺寸和形状,例如ndim属性、size属性、reshape()方法等。这些方法可以帮助您更好地了解和操作数组的结构和形状。
四、数组运算
NumPy中的数组运算可以使用各种数学运算符和NumPy中提供的函数完成。以下是一些示例:
import numpy as np
# 创建两个数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 加法
c = a + b
print(c) # 输出 [5 7 9]
# 减法
d = a - b
print(d) # 输出 [-3 -3 -3]
# 乘法
e = a * b
print(e) # 输出 [ 4 10 18]
# 除法
f = a / b
print(f) # 输出 [0.25 0.4 0.5 ]
# 按位求幂
g = a ** b
print(g) # 输出 [ 1 32 729]
# 按位取余
h = a % b
print(h) # 输出 [1 2 3]
# 求平方根
i = np.sqrt(a)
print(i) # 输出 [1. 1.41421356 1.73205081]
在上面的示例中,我们创建了两个NumPy数组a和b,然后使用加法、减法、乘法、除法、按位求幂、按位取余和求平方根等运算符对它们进行了各种运算。对于所有这些运算,NumPy会对数组的每个元素进行相应的运算。
此外,NumPy还提供了许多其他函数,用于对数组进行各种操作,例如sum()、mean()、std()、min()、max()等,这些函数可以对数组进行聚合操作,或者对数组中的元素进行排序、比较等操作。这些函数可以帮助您更好地了解和操作NumPy数组。
五、数组切片
在NumPy中,可以使用切片操作从数组中获取子数组或部分元素。切片操作使用[start:stop:step]的语法,其中start表示子数组的起始索引,stop表示子数组的结束索引(不包括该索引对应的元素),step表示切片步长。以下是一些示例:
import numpy as np
# 创建一个一维数组
a = np.array([1, 2, 3, 4, 5])
# 获取前三个元素
b = a[:3]
print(b) # 输出 [1 2 3]
# 获取第二个到第四个元素
c = a[1:4]
print(c) # 输出 [2 3 4]
# 获取每隔一个元素的子数组
d = a[::2]
print(d) # 输出 [1 3 5]
# 反转数组
e = a[::-1]
print(e) # 输出 [5 4 3 2 1]
# 创建一个二维数组
f = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 获取第一行
g = f[0, :]
print(g) # 输出 [1 2 3]
# 获取第二列
h = f[:, 1]
print(h) # 输出 [2 5 8]
# 获取前两行和前两列的子数组
i = f[:2, :2]
print(i) # 输出 [[1 2] [4 5]]
在上面的示例中,我们首先创建了一个一维数组a和一个二维数组f,然后使用切片操作从这些数组中获取子数组或部分元素。我们可以使用索引和切片操作来访问一维和多维数组的不同部分,这些操作可以让我们更方便地操作和处理数组中的数据。
六、数组连接
在NumPy中,可以使用各种函数将两个或多个数组连接在一起,以形成更大的数组。以下是一些示例:
import numpy as np
# 创建两个一维数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 水平连接两个数组
c = np.hstack((a, b))
print(c) # 输出 [1 2 3 4 5 6]
# 垂直连接两个数组
d = np.vstack((a, b))
print(d)
# 输出 [[1 2 3]
# [4 5 6]]
# 深度连接两个数组
e = np.dstack((a, b))
print(e)
# 输出 [[[1 4]
# [2 5]
# [3 6]]]
# 创建两个二维数组
f = np.array([[1, 2], [3, 4]])
g = np.array([[5, 6], [7, 8]])
# 水平连接两个数组
h = np.hstack((f, g))
print(h)
# 输出 [[1 2 5 6]
# [3 4 7 8]]
# 垂直连接两个数组
i = np.vstack((f, g))
print(i)
# 输出 [[1 2]
# [3 4]
# [5 6]
# [7 8]]
# 深度连接两个数组
j = np.dstack((f, g))
print(j)
# 输出 [[[1 5]
# [2 6]]
# [[3 7]
# [4 8]]]
在上面的示例中,我们创建了一些数组,并使用hstack()、vstack()和dstack()函数将它们连接在一起。这些函数可以将两个或多个数组沿着不同的维度连接起来,例如在一维数组中进行水平连接,在二维数组中进行水平、垂直和深度连接。这些函数可以帮助我们更方便地将不同的数组组合在一起,并进行一些更复杂的操作和分析。
七、数据存取
NumPy提供了两个函数np.save()
和np.load()
,用于将数组存储到磁盘文件中以及从磁盘文件中加载数组。
np.save(file, arr, allow_pickle=True, fix_imports=True)
:将数组存储到磁盘文件中。file
:文件名,字符串类型。arr
:要保存的数组。allow_pickle
:是否允许pickle序列化。默认为True。fix_imports
:如果为True,则为Python 2和Python 3兼容性而导入pickle模块。默认为True。
np.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding='ASCII')
:从磁盘文件中加载数组。file
:文件名,字符串类型。mmap_mode
:如果给定,使用内存映射来加速读取大文件。默认为None。allow_pickle
:是否允许pickle序列化。默认为True。fix_imports
:如果为True,则为Python 2和Python 3兼容性而导入pickle模块。默认为True。encoding
:如果数据文件是文本文件,则指定文件的编码格式。默认为’ASCII’。
以下是一个简单的示例,演示了如何使用np.save()
和np.load()
函数来保存和加载数组:
import numpy as np
# 创建一个数组
arr = np.array([1, 2, 3, 4, 5])
# 保存数组到文件
np.save('my_array.npy', arr)
# 加载文件中的数组
loaded_array = np.load('my_array.npy')
# 打印加载的数组
print(loaded_array)
在上面的示例中,我们首先创建一个数组arr
,然后使用np.save()
函数将它保存到文件my_array.npy
中。接着,我们使用np.load()
函数从文件中加载数组,并将其存储在loaded_array
变量中。最后,我们打印loaded_array
,以确认我们已经成功地加载了数组。注意,文件名包含文件扩展名.npy
。保存和加载多维数组的方法与此类似,只是需要将数组作为参数传递给相应的函数。
八、数组形态变换
NumPy提供了一些方法,可以用于改变数组的形状或者大小。下面是几个常用的方法,并给出相应的示例:
-
reshape()
方法:改变数组的形状,不改变元素个数import numpy as np # 创建一个3x4的数组 arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) # 将数组形状变为4x3 new_arr = arr.reshape(4, 3) print(new_arr)
array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])
-
resize()
方法:改变数组的形状和大小import numpy as np # 创建一个3x4的数组 arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) # 改变数组的形状和大小为4x5 arr.resize(4, 5) print(arr)
array([[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10], [11, 12, 0, 0, 0], [ 0, 0, 0, 0, 0]])
-
transpose()
方法:交换数组的维度import numpy as np # 创建一个3x4的数组 arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) # 交换数组的维度 new_arr = arr.transpose() print(new_arr)
array([[ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11], [ 4, 8, 12]])
-
flatten()
方法:将数组展开为一维数组import numpy as np # 创建一个3x4的数组 arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) # 将数组展开为一维数组 new_arr = arr.flatten() print(new_arr)
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
这些方法可以方便地对数组进行形态变换,但需要注意的是,有些方法会直接修改原始数组的形状,而有些方法则会返回一个新的数组。在使用这些方法时,需要根据具体的需求来选择合适的方法来实现。
九、数组排序与搜索
NumPy提供了一些方法,可以对数组进行排序和搜索。下面是几个常用的方法,并给出相应的示例:
-
sort()
方法:对数组进行排序import numpy as np # 创建一个随机数组 arr = np.array([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]) # 对数组进行排序 arr.sort() print(arr)
array([1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9])
-
argsort()
方法:返回数组排序后的索引值import numpy as np # 创建一个随机数组 arr = np.array([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]) # 返回数组排序后的索引值 idx = arr.argsort() print(idx)
array([ 1, 3, 6, 0, 9, 2, 4, 8, 10, 7, 5])
-
searchsorted()
方法:返回要插入元素的索引值import numpy as np # 创建一个有序数组 arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # 返回要插入元素的索引值 idx = np.searchsorted(arr, 5) print(idx)
4
-
max()
方法和min()
方法:返回数组中的最大值和最小值import numpy as np # 创建一个随机数组 arr = np.array([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]) # 返回数组中的最大值和最小值 max_value = arr.max() min_value = arr.min() print(max_value, min_value)
9 1
这些方法可以方便地对数组进行排序和搜索,但需要注意的是,排序方法会直接修改原始数组,而搜索方法不会修改数组。在使用这些方法时,需要根据具体的需求来选择合适的方法。
十、矩阵与线性代数运算
NumPy提供了强大的矩阵和线性代数运算功能,下面介绍一些常用的运算方法,并举例说明:
-
创建矩阵
使用
numpy.array()
函数可以创建矩阵。import numpy as np # 创建一个2x2的矩阵 matrix = np.array([[1, 2], [3, 4]]) print(matrix)
array([[1, 2], [3, 4]])
-
矩阵乘法
使用
numpy.dot()
函数可以进行矩阵乘法运算。import numpy as np # 创建两个矩阵 matrix1 = np.array([[1, 2], [3, 4]]) matrix2 = np.array([[5, 6], [7, 8]]) # 矩阵乘法 result = np.dot(matrix1, matrix2) print(result)
array([[19, 22], [43, 50]])
-
矩阵的逆
使用
numpy.linalg.inv()
函数可以求矩阵的逆。import numpy as np # 创建一个2x2的矩阵 matrix = np.array([Numpy/Python 中基本数学运算的速度:为啥整数除法最慢?