找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 236|回复: 1

NumPy:高等数学运算一站搞定

[复制链接]

4

主题

5

回帖

320

积分

中级程序员

积分
320
发表于 7-27-2025 22:09:13 | 显示全部楼层 |阅读模式
本帖最后由 BZR 于 7-28-2025 09:56 编辑

NumPy
今天来聊聊NumPy。NumPy是Python中用于科学计算的库。它提供了多维数组对象、各种衍生对象(如掩码数组和矩阵)以及一系列用于对数组进行快速运算的函数,包括数学运算、逻辑运算、形状操作、排序、选择、输入/输出、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。
同时,Python的Pandas、matplotlib以及tensorflow库也都是以numpy为基础进行编写的。
它作为一个Python的库是被非专业和专业用户编程下载数量总数排名第二(第一是.NET),可见它的实用性。(以下为2024的数据)


1. 安装
安装numpy,只需要在Terminal中输入:
  1. pip3 install numpy
复制代码
之后,在IDLE中,我们会
  1. import numpy as np
复制代码
这样在调用它的时候直接使用np这个名字就行了。

2. 数组访问
numpy数组的基础和Python的列表大差不差,但是要注意的是numpy库本身是用C语言编写来专门针对线性代数的,内部还是有区别的。
要创建一个数组,只要输入np.array()加上list:
  1. a = np.array([1, 2, 3, 4, 5])
复制代码
np.array也可以执行Python list的访问下标、切片等操作(np.array输出每个项之间用空格连接,没有逗号):
  1. print(a[0]) # 1
  2. print(a[:-2]) # [1 2 3]
复制代码
当然,在numpy中,对多位数组的操作比用list来的方便。
  1. a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
  2. print(a[0]) # [1 2 3]
  3. print(a[0, 1]) # 2
复制代码

讲点不一样的:
  1. print(a.shape) # (3, 3)
复制代码
  1. a1 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
  2. print(a1.shape) # (2, 2, 2)
复制代码
array.shape会输出这个数组几个项、每个项有多少个子项、...,就是几行几列。
  1. print(a.ndim) # 2
复制代码
array.ndim会输出这个数组的维度。
  1. print(a.size) # 9
复制代码
array.size会输出这个数组含有多少个项。

3. 数组填充
有时候你不想自己手动输入一个数组,那么可以试试numpy提供的语法。
  1. a = np.full((3, 4), 5)
复制代码
np.full的语法为:np.full(shape, fill_value),上述代码是生成一个形状为(3, 4)、项都为5的数组。
  1. a = np.zeros((5, 4))
复制代码
np.zero更直接,就是生成一个形状为shape的、项全为0的数组。
  1. a = np.ones((2, 2, 5))
复制代码
np.ones一样,区别是项全为1。
  1. a = np.arange(0, 105, 5)
  2. print(a)
  3. '''
  4. [  0   5  10  15  20  25  30  35  40  45  50  55  60  65  70  75  80  85
  5.   90  95 100]
  6. '''
复制代码
np.arange(注意是arange,不是arrange)的语法和for i in range()一模一样,都是(start, stop(, step)),但是它把输出结果封装到了一个数组里。
np.arange()如果不输入start的话,默认从0开始。和for i in range()一样,最后是不包括stop的。
  1. a = np.linspace(0, 1000, 21)
  2. print(a)
  3. '''
  4. [   0.   50.  100.  150.  200.  250.  300.  350.  400.  450.  500.  550.
  5.   600.  650.  700.  750.  800.  850.  900.  950. 1000.]
  6. '''
复制代码
np.linspace在指定的区间内返回等间隔的数字,上述代码就是在0到1000中等距离分出21个数字(注意首尾都算)。

4. 运算
首先,numpy array和Python list的运算就是不一样的。
  1. lst1 = [1, 2, 3]
  2. lst2 = [4, 5, 6]

  3. a1 = np.array(lst1)
  4. a2 = np.array(lst2)
复制代码
  1. print(lst1 * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
  2. print(a1 * 3) # [3 6 9]
复制代码
单一Python list的乘法是将list按顺序重复n遍,而numpy array的乘法是把数组中的每一项都进行乘法这个数学运算。
  1. print(lst1 + 5) # TypeError: can only concatenate list (not "int") to list
  2. print(a1 + 5) # [6 7 8]
复制代码
Python list不允许list加不是list的值,而numpy array是将数组的每项都加n。
  1. print(lst1 + lst2) # [1, 2, 3, 4, 5, 6]
  2. print(a1 + a2) # [5 7 9]
复制代码
Python中list之间的相加是把list 2加到list 1的后面,而numpy array是把两个数组对应下标的数字相加。
  1. print(a1 - a2) # [-3 -3 -3]
  2. print(a1 / a2) # [0.25 0.4 0.5 ]
  3. print(a1 % a2) # [1 2 3]
  4. print(np.sqrt(a1)) # [1. 1.41421356 1.73205081]
复制代码
同样,numpy array可以适应大部分基本运算,而在list中上述代码就会报错。

  1. a1 = np.array([1, 2, 3])
  2. a2 = np.array([[1], [2]])
复制代码
这里介绍一个有趣的语法:如果你把两个shape不同的数组进行运算(当然两个数组的shape得是比较兼容的,要不然压根计算不了),numpy会把单一项数多的数组的每一项分别与第二个数组的每一项相加。上述代码就是[1, 2, 3]分别加1再加2。

当然,numpy有数不胜数的数学运算(sqrt, sin, cos, tan, round, ...),但在这张帖子中一一列举没有意义,所以有需要的可以访问numpy官网:https://numpy.org/doc/stable/reference/routines.math.html

5. 数组操作
我们也可以对数组做添加、插入、删除项等操作。
  1. a = numpy.array([1, 2, 3])
复制代码
  1. np.append(a, [7, 8, 9])
复制代码
np.append(array, values)和Python list的append操作很像,只不过需要指定数组名称。而且此类操作不会更新原有的数组,所以我们还需要额外赋值:
  1. a = np.append(a, [7, 8, 9])
复制代码
  1. a = np.insert(a, 3, [4, 5, 6])
复制代码
np.insert(array, obj, values),这个也和Python list很像,指定数组、下标和要插入的值。
  1. a = np.array([[1, 2, 3], [4, 5, 6]])
复制代码
np.delete的语法会有一点迷惑性,如果只给定数组名和下标,就是np.delete(array, obj),那么会无视维度、删除下标为n的项,输出也会无视维度。
  1. print(np.delete(a, 1, 0)) # [[1 2 3]]
复制代码
如果给定数组名、下标和axis(不知道什么翻译成中文最准确),也就是np.delete(array, obj, axis):
axis = 0:删除下标为n的“行”。在上面的例子中,删除的就是下标为1的行[4, 5, 6]
axis = 1:删除下标为n的“列”。在上面的例子中,删除的就是下标为1的列[[2], [6]]
当然,axis可以>1,但是此时的数组的维度也会上升,再用np.delete语法理解上可能会比较费劲。

6. 数组结构操作
我们也可以对数组的结构进行更改。
  1. a = np.array([[1, 2, 3],
  2.                     [4, 5, 6],
  3.                     [7, 8, 9],
  4.                     [10, 11, 12]])
复制代码
此时a.shape = (4, 3)
  1. print(a.reshape(3, 4))
  2. '''
  3. [[ 1  2  3  4]
  4. [ 5  6  7  8]
  5. [ 9 10 11 12]]
  6. '''
复制代码
reshape函数可以让我们把数组更改到指定结构。
  1. print(a.reshape(12,)) # [ 1  2  3  4  5  6  7  8  9 10 11 12]
复制代码
注意:reshape(12,)和reshape(12,1)是不一样的。前者表示把a的12个项转化成一个一维表格,而后者表示把a的12个项转化成12个1个项的数组。
  1. print(a.flatten()) # [ 1  2  3  4  5  6  7  8  9 10 11 12]
复制代码
flatten()顾名思义,就是把一个数组给“拍扁了”,和上述的reshape(12,)有相同的作用。
  1. print(a.T)
  2. '''
  3. [[ 1  4  7 10]
  4. [ 2  5  8 11]
  5. [ 3  6  9 12]]
  6. '''
复制代码
T是transpose的缩写,是把一个二维数组的行和列进行调转。

以上就是NumPy的一些大致内容了,NumPy的功能远远不止这些,实用性和专业性很高,是做科学运算和数据处理的绝佳工具!(如果想要再研究的可以去官网numpy.org查找)

注:由于字数限制,补充的会放在楼下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1金钱 +10 收起 理由
littleblackLB + 10 赞一个!

查看全部评分

4

主题

5

回帖

320

积分

中级程序员

积分
320
 楼主| 发表于 7-28-2025 10:00:34 | 显示全部楼层

数组的拼接、相加和拆分

本帖最后由 BZR 于 7-28-2025 10:02 编辑

7. 数组的拼接、相加和拆分
和Python list相似,我们还可以对两个或多个数组进行拼接、相加和拆分操作。
  1. a1 = np.array([[1, 2, 3],
  2.                       [4, 5, 6]])
  3. a2 = np.array([[7, 8, 9],
  4.                       [10, 11, 12]])
  5. print(np.concatenate((a1, a2), axis = 0))
复制代码
np.concatenate((a1, a2, ...), axis = n)
axis = 0: “行”;把a2作为一个整体拼到a1后面
axis = 1: “列”;把a2下标为x的项拼到a1下标相同的项的后面
同样,axis可以>1,但是此时的数组的维度也会上升。

  1. print(np.stack(a1, a2))
  2. '''
  3. [[[ 1  2  3]
  4.   [ 4  5  6]]

  5. [[ 7  8  9]
  6.   [10 11 12]]]
  7. '''
复制代码
np.stack((a1, a2, ...))更好理解,就是把a1、a2、... 等数组当作一个整体相加,最后储存在一个新的大数组中,相当于直接把两个数组拼一起再升个维。
  1. a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
  2. print(np.split(a, 2, axis = 0))
  3. '''
  4. [array([[1, 2, 3],
  5.        [4, 5, 6]]), array([[ 7,  8,  9],
  6.        [10, 11, 12]])]
  7. '''
  8. print(np.split(a, 3, axis = 1))
  9. '''
  10. [array([[ 1],
  11.        [ 4],
  12.        [ 7],
  13.        [10]]), array([[ 2],
  14.        [ 5],
  15.        [ 8],
  16.        [11]]), array([[ 3],
  17.        [ 6],
  18.        [ 9],
  19.        [12]])]
  20. '''
复制代码
np.split(array, number_of_sections, axis)是把数组拆分成指定数量的项(前提是拆分方法对应的项数要能除尽),axis指出是通过“行”拆分、通过“列”拆分...

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RealDevClub ( 沪ICP备2024093864号-1 )

GMT+8, 8-10-2025 06:03 , Processed in 0.064603 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表