了解与运用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])

需要注意的是:

  1. 数组x和数组y的元素个数是相同的(两者均是元素 个数为3的一维数组)。

  2. 当x和y的元素个数相同时,可以对各个元素进行算 术运算。

  3. 如果元素个数不同,程序就会报错,所以元素个数保持一致非常重要。

  4. 另外,“对应元素的”的英文是element-wise,比如“对应元素的乘法”就是 element-wise product。

  5. 广播: 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[小G]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值