|
|
本帖最后由 BZR 于 7-28-2025 09:56 编辑
NumPy
今天来聊聊NumPy。NumPy是Python中用于科学计算的库。它提供了多维数组对象、各种衍生对象(如掩码数组和矩阵)以及一系列用于对数组进行快速运算的函数,包括数学运算、逻辑运算、形状操作、排序、选择、输入/输出、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。
同时,Python的Pandas、matplotlib以及tensorflow库也都是以numpy为基础进行编写的。
它作为一个Python的库是被非专业和专业用户编程下载数量总数排名第二(第一是.NET),可见它的实用性。(以下为2024的数据)
1. 安装
安装numpy,只需要在Terminal中输入:之后,在IDLE中,我们会这样在调用它的时候直接使用np这个名字就行了。
2. 数组访问
numpy数组的基础和Python的列表大差不差,但是要注意的是numpy库本身是用C语言编写来专门针对线性代数的,内部还是有区别的。
要创建一个数组,只要输入np.array()加上list:a = np.array([1, 2, 3, 4, 5])
np.array也可以执行Python list的访问下标、切片等操作(np.array输出每个项之间用空格连接,没有逗号):print(a[0]) # 1
print(a[:-2]) # [1 2 3]
当然,在numpy中,对多位数组的操作比用list来的方便。a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a[0]) # [1 2 3]
print(a[0, 1]) # 2
讲点不一样的:a1 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(a1.shape) # (2, 2, 2)
array.shape会输出这个数组几个项、每个项有多少个子项、...,就是几行几列。array.ndim会输出这个数组的维度。array.size会输出这个数组含有多少个项。
3. 数组填充
有时候你不想自己手动输入一个数组,那么可以试试numpy提供的语法。np.full的语法为:np.full(shape, fill_value),上述代码是生成一个形状为(3, 4)、项都为5的数组。np.zero更直接,就是生成一个形状为shape的、项全为0的数组。np.ones一样,区别是项全为1。a = np.arange(0, 105, 5)
print(a)
'''
[ 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85
90 95 100]
'''
np.arange(注意是arange,不是arrange)的语法和for i in range()一模一样,都是(start, stop(, step)),但是它把输出结果封装到了一个数组里。
np.arange()如果不输入start的话,默认从0开始。和for i in range()一样,最后是不包括stop的。a = np.linspace(0, 1000, 21)
print(a)
'''
[ 0. 50. 100. 150. 200. 250. 300. 350. 400. 450. 500. 550.
600. 650. 700. 750. 800. 850. 900. 950. 1000.]
'''
np.linspace在指定的区间内返回等间隔的数字,上述代码就是在0到1000中等距离分出21个数字(注意首尾都算)。
4. 运算
首先,numpy array和Python list的运算就是不一样的。lst1 = [1, 2, 3]
lst2 = [4, 5, 6]
a1 = np.array(lst1)
a2 = np.array(lst2)
print(lst1 * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
print(a1 * 3) # [3 6 9]
单一Python list的乘法是将list按顺序重复n遍,而numpy array的乘法是把数组中的每一项都进行乘法这个数学运算。print(lst1 + 5) # TypeError: can only concatenate list (not "int") to list
print(a1 + 5) # [6 7 8]
Python list不允许list加不是list的值,而numpy array是将数组的每项都加n。print(lst1 + lst2) # [1, 2, 3, 4, 5, 6]
print(a1 + a2) # [5 7 9]
Python中list之间的相加是把list 2加到list 1的后面,而numpy array是把两个数组对应下标的数字相加。print(a1 - a2) # [-3 -3 -3]
print(a1 / a2) # [0.25 0.4 0.5 ]
print(a1 % a2) # [1 2 3]
print(np.sqrt(a1)) # [1. 1.41421356 1.73205081]
同样,numpy array可以适应大部分基本运算,而在list中上述代码就会报错。
a1 = np.array([1, 2, 3])
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. 数组操作
我们也可以对数组做添加、插入、删除项等操作。a = numpy.array([1, 2, 3])
np.append(array, values)和Python list的append操作很像,只不过需要指定数组名称。而且此类操作不会更新原有的数组,所以我们还需要额外赋值:a = np.append(a, [7, 8, 9])
a = np.insert(a, 3, [4, 5, 6])
np.insert(array, obj, values),这个也和Python list很像,指定数组、下标和要插入的值。a = np.array([[1, 2, 3], [4, 5, 6]])
np.delete的语法会有一点迷惑性,如果只给定数组名和下标,就是np.delete(array, obj),那么会无视维度、删除下标为n的项,输出也会无视维度。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. 数组结构操作
我们也可以对数组的结构进行更改。a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]])
此时a.shape = (4, 3)print(a.reshape(3, 4))
'''
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
'''
reshape函数可以让我们把数组更改到指定结构。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个项的数组。print(a.flatten()) # [ 1 2 3 4 5 6 7 8 9 10 11 12]
flatten()顾名思义,就是把一个数组给“拍扁了”,和上述的reshape(12,)有相同的作用。print(a.T)
'''
[[ 1 4 7 10]
[ 2 5 8 11]
[ 3 6 9 12]]
'''
T是transpose的缩写,是把一个二维数组的行和列进行调转。
以上就是NumPy的一些大致内容了,NumPy的功能远远不止这些,实用性和专业性很高,是做科学运算和数据处理的绝佳工具!(如果想要再研究的可以去官网numpy.org查找)
注:由于字数限制,补充的会放在楼下
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
评分
-
查看全部评分
|