User:Xyy23330121/Python/科学计算/数组的运算
本章节将详细讲述数组支持的数学运算。本章节的代码均以下面代码开头。
import numpy as np
当数组和数字进行运算时,相当于数组中每个分量都与该数字进行运算,再将运算结果重新组合成一个数组。比如:
a = np.array([[1,2,3,4],[5,6,7,8]])
b = a + 2
c = a * 2
d = a % 2
e = a ** 2
f = a < 2
print(a,b,c,d,e,f,sep="\n")
以上代码输出为:
[[1 2 3 4]
[5 6 7 8]]
[[ 3 4 5 6]
[ 7 8 9 10]]
[[ 2 4 6 8]
[10 12 14 16]]
[[1 0 1 0]
[1 0 1 0]]
[[ 1 4 9 16]
[25 36 49 64]]
[[ True False False False]
[False False False False]]
数组只能与具有相同 shape 属性的数组进行运算。在运算时,相当于相同位置分量之间进行运算,比如:
a = np.array([[1,2,3,4],[5,6,7,8]])
b = np.array([[1,1,2,2],[1,1,2,2]])
print(a + b)
print(a - b)
print(a * b)
print(a % b)
print(a ** b)
print(a > 3*b)
以上代码输出为:
[[ 2 3 5 6]
[ 6 7 9 10]]
[[0 1 1 2]
[4 5 5 6]]
[[ 1 2 6 8]
[ 5 6 14 16]]
[[0 0 1 0]
[0 0 1 0]]
[[ 1 2 9 16]
[ 5 6 49 64]]
[[False False False False]
[ True True True True]]
使用“不完全由 Python 运算符构成”的函数处理数组时,很可能出现错误。比如:
import math
a = np.array([[1,2,3,4],[5,6,7,8]])
print(math.sin(a)) #TypeError
这里之所以会报错,是因为 Python 的 math 模块使用的并非 Python 内部的数学计算,而是将传入的参数转化为浮点数,然后使用预先编译好的可执行文件,由可执行文件内部进行数学计算并返回结果。中间这个传递参数的过程不支持 numpy 的会导致错误。
对于数学函数,一个通用的办法是类比之前章节任意维度列表复制的内容:
import math
def calculate(array, func):
return np.array([
(calculate(obj, func) if isinstance(obj, np.ndarray) else func(obj))
for obj in array])
a = np.array([[1,2,3,4],[5,6,7,8]])
print(calculate(a, math.sin))
此时会输出正常的结果。需要注意的是,在 numpy 中,数组的类型是 numpy.ndarray 而非 np.array,因此上面的 calculate 函数在判定类型时,使用了 np.ndarray 来判定,而不是使用 np.array 来判定。
除去上面的通用方法之外,numpy 模块中有许多 Python 数学函数的“numpy 版本”。numpy 版本的数学函数支持直接输入数组进行操作。比如上面的运算,如果使用 numpy 的数学函数,则可以简化成:
a = np.array([[1,2,3,4],[5,6,7,8]])
print(np.sin(a))
具体数学函数列表可以参见 numpy数学函数 子页面。或者查询下面的文档:
- https://numpy.org/doc/stable/reference/routines.emath.html
- https://numpy.org/doc/stable/reference/routines.math.html
https://numpy.org/doc/stable/reference/routines.bitwise.html
https://numpy.org/doc/stable/reference/arrays.ndarray.html#calculation
https://numpy.org/doc/stable/reference/routines.polynomials.html