上节课我们讲述了 ndarray 的创建及属性。 本节课我们讲述 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)
2
3
4
5
6
7
从上述代码的执行结果可以看出,在对 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
3
4
5
6
7
# 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)
2
3
4
5
6
7
从上述代码的执行结果可以看出,在对 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
3
4
5
6
7
# 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)
2
3
4
5
6
7
从上述代码的执行结果可以看出,在对 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
3
4
5
6
7
# 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)
2
3
4
5
6
7
从上述代码的执行结果可以看出,在对 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)
2
3
4
5
6
7
上述代码会报错,需要改成如下形式:
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)
2
3
4
5
6
7
# 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)
2
3
4
5
6
7
从上述代码的执行结果可以看出,在对 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
3
4
5
6
7
# 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)
2
3
4
5
6
7
从上述代码的执行结果可以看出,在对 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
3
4
5
6
7
# 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)
2
3
4
5
6
7
8
9
10
从上述代码的执行结果可以看出,两个 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
3
4
5
6
7
8
9
10
# 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
3
4
5
6
7
8
9
10
# 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
3
4
5
6
7
8
9
10
上面讲的是一维数组之间的运算,同样的运算也适用于多维数组,下面以二维数组为例做介绍。
# 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)
2
3
4
5
6
7
二维数组之间的运算和一维数组类似,以加法来说,在进行运算时,两个数组相同位置上的元素相加。同样要求两个 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
3
4
5
6
7
# 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
3
4
5
6
7
# 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)
2
3
4
5
6
7
# 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)
2
3
4
5
6
7
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)
print(dot_arr)
2
3
4
5
6
7
由于 my_arr1
和 my_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)
2
3
4
5
6
7
同样的,上述代码还有另外一种写法:
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)
2
3
4
5
6
7
# 4.一些函数
# 4.1 一维数组
# 4.1.1 sqrt() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.sqrt(my_arr))
2
3
4
上述代码求数组中各个元素的平方根。
# 4.1.2 log() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.log(my_arr))
2
3
4
上述代码求数组中各个元素以 e 为底的对数。
# 4.1.3 sin() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.sin(my_arr))
2
3
4
上述代码求数组中各个元素(元素的值代表弧度)的正弦值。
# 4.1.4 cos() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.cos(my_arr))
2
3
4
上述代码求数组中各个元素(元素的值代表弧度)的余弦值。
# 4.1.5 sum() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.sum(my_arr))
2
3
4
上述代码求数组中各个元素的和。
# 4.1.6 min() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.min(my_arr))
2
3
4
上述代码求数组中各个元素中的最小值。
# 4.1.7 max() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.max(my_arr))
2
3
4
上述代码求数组中各个元素中的最大值。
# 4.1.8 mean() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.mean(my_arr))
2
3
4
上述代码求数组中各个元素的平均值。
# 4.1.9 std() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.std(my_arr))
2
3
4
上述代码求数组中各个元素的标准差。
# 4.1.10 cumsum() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.cumsum(my_arr))
2
3
4
上述代码求数组中各个元素的累计和,得到的是一个和原来的数组维度相同的数组。
# 4.1.11 cumprod() 函数
import numpy as np
my_arr = np.arange(1, 7)
print(np.cumprod(my_arr))
2
3
4
上述代码求数组中各个元素的累计积,得到的是一个和原来的数组维度相同的数组。
# 4.2 二维数组
# 4.2.1 sum() 函数
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.sum(my_arr))
2
3
4
上述代码求数组中各个元素的和。
对于二维数组来说,在进行求和时,可以指定坐标轴,如果传入参数 axis=0
,则对每列进行求和;如果传入参数 axis=1
,则对每行进行求和。我们分别通过代码来看:
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.sum(my_arr, axis=0))
2
3
4
上述代码对二维数组的每列进行求和,得到一个一维数组。
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.sum(my_arr, axis=1))
2
3
4
上述代码对二维数组的每行进行求和,得到一个一维数组。
# 4.2.2 min() 函数
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.min(my_arr))
2
3
4
上述代码求数组中各个元素中的最小值。
min() 函数同样可以传入 axis
参数,例如:
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.min(my_arr, axis=0))
2
3
4
上述代码求二维数组每列的最小值,得到一个一维数组。
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.min(my_arr, axis=1))
2
3
4
上述代码求二维数组每行的最小值,得到一个一维数组。
# 4.2.3 max() 函数
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.max(my_arr))
2
3
4
上述代码求数组中各个元素中的最大值。
max() 函数同样可以传入 axis
参数,例如:
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.max(my_arr, axis=0))
2
3
4
上述代码求二维数组每列的最大值,得到一个一维数组。
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.max(my_arr, axis=1))
2
3
4
上述代码求二维数组每行的最大值,得到一个一维数组。
# 4.2.4 mean() 函数
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.mean(my_arr))
2
3
4
上述代码求数组中各个元素的平均值。
mean() 函数同样可以传入 axis
参数,例如:
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.mean(my_arr, axis=0))
2
3
4
上述代码求二维数组每列的平均值,得到一个一维数组。
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.mean(my_arr, axis=1))
2
3
4
上述代码求二维数组每行的平均值,得到一个一维数组。
# 4.2.5 std() 函数
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.std(my_arr))
2
3
4
上述代码求数组中各个元素的标准差。
std() 函数同样可以传入 axis
参数,例如:
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.std(my_arr, axis=0))
2
3
4
上述代码求二维数组每列的标准差,得到一个一维数组。
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.std(my_arr, axis=1))
2
3
4
上述代码求二维数组每行的标准差,得到一个一维数组。
# 4.2.6 cumsum() 函数
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.cumsum(my_arr))
2
3
4
上述代码求数组中各个元素的累计和。
cumsum() 函数同样可以传入 axis
参数,例如:
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.cumsum(my_arr, axis=0))
2
3
4
上述代码求数组每列的累计和,得到的是一个和原来的数组维度相同的数组。
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.cumsum(my_arr, axis=1))
2
3
4
上述代码求数组每行的累计和,得到的是一个和原来的数组维度相同的数组。
# 4.2.7 cumprod() 函数
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.cumprod(my_arr))
2
3
4
上述代码求数组中各个元素的累计积。
cumprod() 函数同样可以传入 axis
参数,例如:
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.cumprod(my_arr, axis=0))
2
3
4
上述代码求数组每列的累计积,得到的是一个和原来的数组维度相同的数组。
import numpy as np
my_arr = np.arange(1, 10).reshape(3,3)
print(np.cumprod(my_arr, axis=1))
2
3
4
上述代码求数组每行的累计积,得到的是一个和原来的数组维度相同的数组。
# 5.总结
# 6.练习题
通过 arange 函数创建一个 3*3
的 ndarray,并按列的方向求累积和。