上节课我们讲述了 ndarray 的创建及属性。

image

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

1.ndarray 和标量之间的运算

1.1 加法运算

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr = my_arr + 3
print(my_arr)

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

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr += 3
print(my_arr)

1.2 减法运算

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr = my_arr - 3
print(my_arr)

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

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr -= 3
print(my_arr)

1.3 乘法运算

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr = my_arr * 3
print(my_arr)

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

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr *= 3
print(my_arr)

1.4 除法运算

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr = my_arr / 3
print(my_arr)

从上述代码的执行结果可以看出,在对 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
print(my_arr)

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

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list, dtype=np.float64)

my_arr /= 3
print(my_arr)

1.5 取余运算

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr = my_arr % 3
print(my_arr)

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

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr %= 3
print(my_arr)

1.6 取整运算

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr = my_arr // 3
print(my_arr)

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

import numpy as np

my_list = [1, 2, 3, 4, 5, 6]
my_arr = np.array(my_list)

my_arr //= 3
print(my_arr)

2.ndarray 之间的运算

2.1 一维数组

2.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
print(sum_arr)

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

2.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
print(sub_arr)

2.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
print(mul_arr)

2.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
print(div_arr)

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

2.2 二维数组

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
print(sum_arr)

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

2.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
print(sub_arr)

2.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
print(mul_arr)

2.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
print(div_arr)

3.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)
print(dot_arr)

ndarray 点乘的规则是: image 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)
print(dot_arr)

由于 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)
print(dot_arr)

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

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)
print(dot_arr)

4.一些函数

4.1 一维数组

4.1.1 sqrt() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.sqrt(my_arr))

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

4.1.2 log() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.log(my_arr))

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

4.1.3 sin() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.sin(my_arr))

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

4.1.4 cos() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.cos(my_arr))

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

4.1.5 sum() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.sum(my_arr))

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

4.1.6 min() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.min(my_arr))

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

4.1.7 max() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.max(my_arr))

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

4.1.8 mean() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.mean(my_arr))

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

4.1.9 std() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.std(my_arr))

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

4.1.10 cumsum() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.cumsum(my_arr))

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

4.1.11 cumprod() 函数

import numpy as np

my_arr = np.arange(1, 7)
print(np.cumprod(my_arr))

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

4.2 二维数组

4.2.1 sum() 函数

import numpy as np

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

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

import numpy as np

my_arr = np.arange(1, 10).reshape(3,3)
print(np.sum(my_arr, axis=0))

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

import numpy as np

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

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

4.2.2 min() 函数

import numpy as np

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

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

import numpy as np

my_arr = np.arange(1, 10).reshape(3,3)
print(np.min(my_arr, axis=0))

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

import numpy as np

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

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

4.2.3 max() 函数

import numpy as np

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

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

import numpy as np

my_arr = np.arange(1, 10).reshape(3,3)
print(np.max(my_arr, axis=0))

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

import numpy as np

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

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

4.2.4 mean() 函数

import numpy as np

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

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

import numpy as np

my_arr = np.arange(1, 10).reshape(3,3)
print(np.mean(my_arr, axis=0))

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

import numpy as np

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

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

4.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)
print(np.std(my_arr, axis=0))

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

import numpy as np

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

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

4.2.6 cumsum() 函数

import numpy as np

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

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

import numpy as np

my_arr = np.arange(1, 10).reshape(3,3)
print(np.cumsum(my_arr, axis=0))

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

import numpy as np

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

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

4.2.7 cumprod() 函数

import numpy as np

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

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

import numpy as np

my_arr = np.arange(1, 10).reshape(3,3)
print(np.cumprod(my_arr, axis=0))

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

import numpy as np

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

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

5.总结

image