跳转到内容

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 数学函数

[编辑 | 编辑源代码]

使用“不完全由 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 的数学运算函数

[编辑 | 编辑源代码]

除去上面的通用方法之外,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.bitwise.html

数组元素的计算

[编辑 | 编辑源代码]

https://numpy.org/doc/stable/reference/arrays.ndarray.html#calculation

多项式

[编辑 | 编辑源代码]

https://numpy.org/doc/stable/reference/routines.polynomials.html

随机采样

[编辑 | 编辑源代码]

https://numpy.org/doc/stable/reference/random/index.html

统计:排序与计数

[编辑 | 编辑源代码]

https://numpy.org/doc/stable/reference/routines.sort.html