了解与运用numpy
使用numpy好处
Python等动态类型语言一般比C和C++等静态类型语言(编译型语言) 运算速度慢。
实际上,如果是运算量大的处理对象,用C/C++写程 序更好。为此,当Python中追求性能时,人们会用C/C++来实现 处理的内容。
Python则承担“中间人”的角色,负责调用那些用C/ C++写的程序。NumPy中,主要的处理也都是通过C或C++实现的。
因此,我们可以在不损失性能的情况下,使用Python便利的语法。
生成NumPy数组
使用np.array()
方法。np.array()
接收Python 列表作为参数,生成NumPy数组。
>>> x = np.array([1.0, 2.0, 3.0])
>>> print(x) [ 1. 2. 3.]
>>> type(x)
<class 'numpy.ndarray'>
NumPy 的算术运算
下面是NumPy数组的算术运算的例子。
>>> x = np.array([1.0, 2.0, 3.0])
>>> y = np.array([2.0, 4.0, 6.0])
>>> x + y # 对应元素的加法
array([ 3., 6., 9.])
>>> x - y
array([ -1., -2., -3.])
>>> x * y # element-wise product
array([ 2., 8., 18.])
>>> x / y
array([ 0.5, 0.5, 0.5])
需要注意的是:
-
数组x和数组y的元素个数是相同的(两者均是元素 个数为3的一维数组)。
-
当x和y的元素个数相同时,可以对各个元素进行算 术运算。
-
如果元素个数不同,程序就会报错,所以元素个数保持一致非常重要。
-
另外,“对应元素的”的英文是element-wise,比如“对应元素的乘法”就是 element-wise product。
-
广播: NumPy数组不仅可以进行element-wise运算,也可以和单一的数值(标量)组合起来进行运算。此时,需要在NumPy数组的各个元素和标量之间进行运算。
这个功能也被称为
广播
>>> x = np.array([1.0, 2.0, 3.0]) >>> x / 2.0 array([ 0.5, 1. , 1.5])
NumPy的N维数组
NumPy不仅可以生成一维数组(排成一列的数组),也可以生成多维数组。
比如,可以生成如下的二维数组(矩阵)。
>>> A = np.array([[1, 2], [3, 4],[5,6]])
>>> print(A)
[[1 2]
[3 4]
[5 6]]
>>> A.shape
(3, 2)
>>> A.dtype
dtype('int32')
这里生成了一个3×2的矩阵A。
矩阵A的形状可以通过shape查看。
矩阵元素的数据类型可以通过dtype查看。
下面,我们来看一下矩阵的算术运算
>>> A = np.array([[1,2],[3,4]])
>>> B = np.array([[3, 0],[0, 6]])
>>> A + B
array([[ 4, 2],
[ 3, 10]])
>>> A * B
array([[ 3, 0],
[ 0, 24]])
注意:矩阵也有广播功能
>>> print(A)
[[1 2]
[3 4]]
>>> A * 10
array([[ 10, 20],
[ 30, 40]])
NumPy数组(np.array)可以生成N维数组,即可以生成一维数组、 二维数组、三维数组等任意维数的数组。
数学上将一维数组称为向量, 将二维数组称为矩阵。
另外,可以将一般化之后的向量或矩阵等统称为张量(tensor)。
这里将二维数组称为“矩阵”,将三维数组及三维以上的数组称为“张量”
或“多维数组”
广播
NumPy中,形状不同的数组之间也可以进行运算。之前的例子中,在 2×2的矩阵A和标量10之间进行了乘法运算。在这个过程中,如图1-1所示, 标量10被扩展成了2×2的形状,然后再与矩阵A进行乘法运算。这个巧妙 的功能称为广播
(broadcast)。
>>> print(A)
[[1 2]
[3 4]]
>>> A * 10
array([[ 10, 20],
[ 30, 40]])
通过下面这个运算再来看一个广播的例子。
>>> A = np.array([[1, 2], [3, 4]])
>>> B = np.array([10, 20])
>>> A * B
array([[ 10, 40],
[ 30, 80]])
在这个运算中,一维数组B被“巧妙地”变成了和二位数 组A相同的形状,然后再以对应元素的方式进行运算。
综上,因为NumPy有广播功能,所以不同形状的数组之间也可以顺利 地进行运算。
访问元素
元素的索引从0开始。对各个元素的访问可按如下方式进行。
>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> print(X)
[[51 55]
[14 19]
[ 0 4]]
>>> X[0] # 第0行
array([51, 55])
>>> X[0][1] # (0,1)的元素
55
也可以使用for
语句访问各个元素
>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> for row in X:
... print(row) #第row行
...
[51 55]
[14 19]
[0 4]
除了前面介绍的索引操作,NumPy还可以使用数组访问各个元素。
>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> X = X.flatten() # 将X转换为一维数组
>>> print(X)
[51 55 14 19 0 4]
>>> X[np.array([0, 2, 4])] # 获取索引为0、2、4的元素
array([51, 14, 0])
运用这个标记法,可以获取满足一定条件的元素。例如,要从X中抽出大于15的元素,可以写成如下形式。
>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> X > 15
#对NumPy数组使用不等号运算符等(上例中是X > 15),结果会得到一个布尔型的数组
array([ True, True, False, True, False, False], dtype=bool)
>>> X[X>15] #用方括号
array([51, 55, 19])
注意:X[X>15]
最后返回一个一维数组
如果 x 为二维矩阵,如下:
x = array([[ 1, 2, 3, 4],[ 5, 6, 7, 8],[ 9, 10, 11, 12]])
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
- 取出前两行:
x[0:2]
或x[[0,1]]
- 分别取出前两行在中间的两个数:
x[0:2,1:3]
或x[0:2,[1,2]]
或x[[0,1],1:3]
array([[2, 3],
[6, 7]])
- 取出第0行第0个数和第2行第3个数:
x[[0,2],[0,3]]
array([ 1, 12])
- 取出单个数据:第0行第1个
x[0,1]
或x[0][1]
2
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/15383619.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人