第三章 ndarray的基本操作

NumPy入门教程

第一章 NumPy 介绍
第二章 ndarray的创建及其属性
第三章 ndarray的基本操作
第四章 ndarray的索引、切片和遍历
第五章 ndarray的重塑、组合和拆分
第六章 用于ndarray的文件操作
第七章 ndarray的赋值、视图、拷贝和广播



前言

上一章我们讲述了 ndarray 的创建及属性。本节课我们讲述 ndarray 的基本操作。在第一节课的时候,我们提到过 ndarray 支持元素方式的操作。下面我们就对 ndarray 支持的操作做一个详细的讲述。


一、ndarray 和标量之间的运算

1.加法运算

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr = my_arr + 3
>>> my_arr
array([4, 5, 6, 7, 8, 9])

从上述代码的执行结果可以看出,在对 ndarray 执行加法运算时,ndarray 中的每个元素都会加上相应的值。在执行加法运算时,同样可以使用 += 运算符。例如:

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr += 3
>>> my_arr
array([4, 5, 6, 7, 8, 9])

2.减法运算

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr = my_arr - 3
>>> my_arr
array([-2, -1,  0,  1,  2,  3])

从上述代码的执行结果可以看出,在对 ndarray 执行减法运算时,ndarray 中的每个元素都会减去相应的值。在执行减法运算时,同样可以使用 -= 运算符。例如:

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr -= 3
>>> my_arr
array([-2, -1,  0,  1,  2,  3])

3.乘法运算

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr = my_arr * 3
>>> my_arr
array([ 3,  6,  9, 12, 15, 18])

从上述代码的执行结果可以看出,在对 ndarray 执行乘法运算时,ndarray 中的每个元素都会乘上相应的值。在执行乘法运算时,同样可以使用 *= 运算符。例如:

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr *= 3
>>> my_arr
array([ 3,  6,  9, 12, 15, 18])

4.除法运算

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr = my_arr / 3
>>> my_arr
array([0.33333333, 0.66666667, 1.        , 1.33333333, 1.66666667,
       2.        ])

从上述代码的执行结果可以看出,在对 ndarray 执行除法运算时,ndarray 中的每个元素都会除以相应的值。在执行除法运算时,同样可以使用 /= 运算符,在使用 /= 操作符时要把 ndarray 中元素的类型更改为 float64,否则会报错。例如:

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr /= 3
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    my_arr /= 3
TypeError: No loop matching the specified signature and casting was found for ufunc true_divide

上述代码会报错,需要改成如下形式:

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list, dtype=np.float64)
>>>
>>> my_arr /= 3
>>> my_arr
array([0.33333333, 0.66666667, 1.        , 1.33333333, 1.66666667,
       2.        ])

5.取余运算

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr = my_arr % 3
>>> my_arr
array([1, 2, 0, 1, 2, 0])

从上述代码的执行结果可以看出,在对 ndarray 执行取余运算时,ndarray 中的每个元素都会对相应的值取余。在执行取余运算时,同样可以使用 %= 运算符。例如:

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr %= 3
>>> my_arr
array([1, 2, 0, 1, 2, 0])

6.取整运算

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr = my_arr // 3
>>> my_arr
array([0, 0, 1, 1, 1, 2])

从上述代码的执行结果可以看出,在对 ndarray 执行取整运算时,ndarray 中的每个元素都会对相应的值取整。在执行取整运算时,同样可以使用 //= 运算符。例如:

>>> import numpy as np
>>>
>>> my_list = [1, 2, 3, 4, 5, 6]
>>> my_arr = np.array(my_list)
>>>
>>> my_arr //= 3
>>> my_arr
array([0, 0, 1, 1, 1, 2])

二、ndarray 之间的运算

1.一维数组

1.1 加法运算

>>> import numpy as np
>>>
>>> my_list1 = [1, 2, 3, 4, 5, 6]
>>> my_arr1 = np.array(my_list1)
>>>
>>> my_list2 = [7, 8, 9, 10, 11, 12]
>>> my_arr2 = np.array(my_list2)
>>>
>>> sum_arr = my_arr1 + my_arr2
>>> sum_arr
array([ 8, 10, 12, 14, 16, 18])

从上述代码的执行结果可以看出,两个 ndarray 在执行加法运算时,规则是两个 ndarray 相同位置的元素相加。另外还有一点要注意的是,进行运算的两个 ndarray 的维度数以及每个维度的大小必须相同,否则会出错。其他类型的运算和加法运算类似,就不一一详细讲述了,大家可以通过下面的代码来感受下。

1.2 减法运算

>>> import numpy as np
>>>
>>> my_list1 = [1, 2, 3, 4, 5, 6]
>>> my_arr1 = np.array(my_list1)
>>>
>>> my_list2 = [7, 8, 9, 10, 11, 12]
>>> my_arr2 = np.array(my_list2)
>>>
>>> sub_arr = my_arr1 - my_arr2
>>> sub_arr
array([-6, -6, -6, -6, -6, -6])

1.3 乘法运算

>>> import numpy as np
>>>
>>> my_list1 = [1, 2, 3, 4, 5, 6]
>>> my_arr1 = np.array(my_list1)
>>>
>>> my_list2 = [7, 8, 9, 10, 11, 12]
>>> my_arr2 = np.array(my_list2)
>>>
>>> mul_arr = my_arr1 * my_arr2
>>> mul_arr
array([ 7, 16, 27, 40, 55, 72])

1.4 除法运算

>>> import numpy as np
>>>
>>> my_list1 = [1, 2, 3, 4, 5, 6]
>>> my_arr1 = np.array(my_list1)
>>>
>>> my_list2 = [7, 8, 9, 10, 11, 12]
>>> my_arr2 = np.array(my_list2)
>>>
>>> div_arr = my_arr1 / my_arr2
>>> div_arr
array([0.14285714, 0.25      , 0.33333333, 0.4       , 0.45454545,
       0.5       ])

上面讲的是一维数组之间的运算,同样的运算也适用于多维数组,下面以二维数组为例做介绍。

2.二维数组

2.1 加法运算

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(1, 10).reshape(3,3)
>>> my_arr2 = np.arange(2, 11).reshape(3,3)
>>>
>>> sum_arr = my_arr1 + my_arr2
>>> sum_arr
array([[ 3,  5,  7],
       [ 9, 11, 13],
       [15, 17, 19]])

二维数组之间的运算和一维数组类似,以加法来说,在进行运算时,两个数组相同位置上的元素相加。同样要求两个 ndarray 的维度数以及每个维度的大小必须相同,否则会出错。其他类型的运算和加法运算类似,就不一一详细讲述了,大家可以通过下面的代码来感受下。

2.2 减法运算

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(1, 10).reshape(3,3)
>>> my_arr2 = np.arange(2, 11).reshape(3,3)
>>>
>>> sub_arr = my_arr2 - my_arr1
>>> sub_arr
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])

2.3 乘法运算

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(1, 10).reshape(3,3)
>>> my_arr2 = np.arange(2, 11).reshape(3,3)
>>>
>>> mul_arr = my_arr2 * my_arr1
>>> mul_arr
array([[ 2,  6, 12],
       [20, 30, 42],
       [56, 72, 90]])

2.4 除法运算

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(1, 10).reshape(3,3)
>>> my_arr2 = np.arange(2, 11).reshape(3,3)
>>>
>>> div_arr = my_arr2 / my_arr1
>>> div_arr
array([[2.        , 1.5       , 1.33333333],
       [1.25      , 1.2       , 1.16666667],
       [1.14285714, 1.125     , 1.11111111]])

三、ndarray 的点乘

上面讲到的 ndarray 乘法是两个 ndarray 相同位置的元素相乘。下面来讲下 ndarray 的点乘。ndarray 的点乘需要使用 dot() 函数。

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(1, 10).reshape(3,3)
>>> my_arr2 = np.ones((3, 3))
>>>
>>> dot_arr = np.dot(my_arr1, my_arr2)
>>> dot_arr
array([[ 6.,  6.,  6.],
       [15., 15., 15.],
       [24., 24., 24.]])

ndarray 点乘的规则是:
在这里插入图片描述
ndarray 有点要注意的是,只有当矩阵 A 的列数(column)等于矩阵 B 的行数(row)时,A 与 B 才可以相乘。上面的点乘还可以写成如下形式:

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(1, 10).reshape(3,3)
>>> my_arr2 = np.ones((3, 3))
>>>
>>> dot_arr = my_arr1.dot(my_arr2)
>>> dot_arr
array([[ 6.,  6.,  6.],
       [15., 15., 15.],
       [24., 24., 24.]])

由于 my_arr1my_arr2 都是 3 行 3 列的数组,在进行点乘时,也可以把 my_arr2 放在前面,只不过结果会有所不同,例如:

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(1, 10).reshape(3,3)
>>> my_arr2 = np.ones((3, 3))
>>>
>>> dot_arr = np.dot(my_arr2, my_arr1)
>>> dot_arr
array([[12., 15., 18.],
       [12., 15., 18.],
       [12., 15., 18.]])

同样的,上述代码还有另外一种写法:

>>> import numpy as np
>>>
>>> my_arr1 = np.arange(1, 10).reshape(3,3)
>>> my_arr2 = np.ones((3, 3))
>>>
>>> dot_arr = my_arr2.dot(my_arr1)
>>> dot_arr
array([[12., 15., 18.],
       [12., 15., 18.],
       [12., 15., 18.]])

四、一些函数

1.一维数组

1.1 sqrt() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.sqrt(my_arr)
array([1.        , 1.41421356, 1.73205081, 2.        , 2.23606798,
       2.44948974])

上述代码求数组中各个元素的平方根。

1.2 log() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.log(my_arr)
array([0.        , 0.69314718, 1.09861229, 1.38629436, 1.60943791,
       1.79175947])

上述代码求数组中各个元素以 e 为底的对数。

1.3 sin() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.sin(my_arr)
array([ 0.84147098,  0.90929743,  0.14112001, -0.7568025 , -0.95892427,
       -0.2794155 ])

上述代码求数组中各个元素(元素的值代表弧度)的正弦值。

1.4 cos() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.cos(my_arr)
array([ 0.54030231, -0.41614684, -0.9899925 , -0.65364362,  0.28366219,
        0.96017029])

上述代码求数组中各个元素(元素的值代表弧度)的余弦值。

1.5 sum() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.sum(my_arr)
21

上述代码求数组中各个元素的和。

1.6 min() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.min(my_arr)
1

上述代码求数组中各个元素中的最小值。

1.7 max() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.max(my_arr)
6

上述代码求数组中各个元素中的最大值。

1.8 mean() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.mean(my_arr)
3.5

上述代码求数组中各个元素的平均值。

1.9 std() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.std(my_arr)
1.707825127659933

上述代码求数组中各个元素的标准差。

1.10cumsum() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.cumsum(my_arr)
array([ 1,  3,  6, 10, 15, 21])

上述代码求数组中各个元素的累计和,得到的是一个和原来的数组维度相同的数组。

1.11 cumprod() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 7)
>>> np.cumprod(my_arr)
array([  1,   2,   6,  24, 120, 720])

上述代码求数组中各个元素的累计积,得到的是一个和原来的数组维度相同的数组。

2.二维数组

2.1 sum() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.sum(my_arr)
45

上述代码求数组中各个元素的和。对于二维数组来说,在进行求和时,可以指定坐标轴,如果传入参数 axis=0,则对每列进行求和;如果传入参数 axis=1,则对每行进行求和。我们分别通过代码来看:

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.sum(my_arr, axis=0)
array([12, 15, 18])

上述代码对二维数组的每列进行求和,得到一个一维数组。

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.sum(my_arr, axis=1)
array([ 6, 15, 24])

上述代码对二维数组的每行进行求和,得到一个一维数组。

2.2 min() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.min(my_arr)
1

上述代码求数组中各个元素中的最小值。min() 函数同样可以传入 axis 参数,例如:

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.min(my_arr, axis=0)
array([1, 2, 3])

上述代码求二维数组每列的最小值,得到一个一维数组。

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.min(my_arr, axis=1)
array([1, 4, 7])

上述代码求二维数组每行的最小值,得到一个一维数组。

2.3 max() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.max(my_arr)
9

上述代码求数组中各个元素中的最大值。max() 函数同样可以传入 axis 参数,例如:

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.max(my_arr, axis=0)
array([7, 8, 9])

上述代码求二维数组每列的最大值,得到一个一维数组。

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.max(my_arr, axis=1)
array([3, 6, 9])

上述代码求二维数组每行的最大值,得到一个一维数组。

2.4 mean() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.mean(my_arr)
5.0

上述代码求数组中各个元素中的平均值。mean() 函数同样可以传入 axis 参数,例如:

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.mean(my_arr, axis=0)
array([4., 5., 6.])

上述代码求二维数组每列的平均值,得到一个一维数组。

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.mean(my_arr, axis=1)
array([2., 5., 8.])

上述代码求二维数组每行的平均值,得到一个一维数组。

2.5 std() 函数

import numpy as np

my_arr = np.arange(1, 10).reshape(3,3)
print(np.std(my_arr))

上述代码求数组中各个元素中的标准差。std() 函数同样可以传入 axis 参数,例如:

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.std(my_arr, axis=0)
array([2.44948974, 2.44948974, 2.44948974])

上述代码求二维数组每列的标准差,得到一个一维数组。

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.std(my_arr, axis=1)
array([0.81649658, 0.81649658, 0.81649658])

上述代码求二维数组每行的标准差,得到一个一维数组。

2.6 cumsum() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.cumsum(my_arr)
array([ 1,  3,  6, 10, 15, 21, 28, 36, 45])

上述代码求数组中各个元素的累计和,得到的是一个和原来的数组维度相同的数组。
cumsum() 函数同样可以传入 axis 参数,例如:

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.cumsum(my_arr, axis=0)
array([[ 1,  2,  3],
       [ 5,  7,  9],
       [12, 15, 18]])

上述代码求数组每列的累计和,得到的是一个和原来的数组维度相同的数组。

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.cumsum(my_arr, axis=1)
array([[ 1,  3,  6],
       [ 4,  9, 15],
       [ 7, 15, 24]])

上述代码求数组每行的累计和,得到的是一个和原来的数组维度相同的数组。

2.7 cumprod() 函数

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.cumprod(my_arr)
array([     1,      2,      6,     24,    120,    720,   5040,  40320,
       362880])

上述代码求数组中各个元素的累计积,得到的是一个和原来的数组维度相同的数组。
cumprod() 函数同样可以传入 axis 参数,例如:

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.cumprod(my_arr, axis=0)
array([[  1,   2,   3],
       [  4,  10,  18],
       [ 28,  80, 162]])

上述代码求数组每列的累计积,得到的是一个和原来的数组维度相同的数组。

>>> import numpy as np
>>>
>>> my_arr = np.arange(1, 10).reshape(3,3)
>>> np.cumprod(my_arr, axis=1)
array([[  1,   2,   6],
       [  4,  20, 120],
       [  7,  56, 504]])

上述代码求数组每行的累计积,得到的是一个和原来的数组维度相同的数组。


总结

本章我们介绍了ndarray和标量之间的运算,ndarray之间的运算,ndarray的点乘以及一些函数。

上一章 ndarray的创建及属性
下一章 ndarray的索引、切片和遍历

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值