0%

NumPy数组之常用操作

这里介绍NumPy数组的常用操作

abstract.png

基本运算

逐元素运算

运算符将操作应用于数组中的每个元素,而不是把整个数组作为一个整体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
a = np.array([100,200,300])
b = np.array([1,2,3])

# 逐元素加法 +
print(a+b)
# 输出: [101 202 303]

# 逐元素减法 -
print(a-b)
# 输出: [ 99 198 297]

# 逐元素除法 /
print(a/b)
# 输出: [100. 100. 100.]

# 逐元素乘法 * , 即所谓的 哈达玛积(Hadamard积)
print(a*b)
# 输出: [100 400 900]

# 逐元素幂运算 **
m = np.array([1,2,3])
n = np.array([9,3,2])
print(m**n)
# 输出:[1 8 9]

向量点乘

当操作数均为 一维数组(向量) 时,可通过下述方式进行向量的点乘(内积)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np

v1 = np.array([6,7,8])
v2 = np.array([3,1,2])

# 操作数均为一维度数组(向量)时,结果为向量的点乘(内积)
print(np.matmul(v1,v2))
# 输出:41
# 解释:6*3 + 7*1 + 8*2 = 41

# Python>=3.5时,NumPy的向量点乘可用@运算符
# 操作数均为一维度数组(向量)时,结果为向量的点乘(内积)
print(v1@v2)
# 输出:41

# 操作数均为一维度数组(向量)时,结果为向量的点乘(内积)
print(v1.dot(v2))
# 输出:41

矩阵乘法

当操作数均为 二维数组(矩阵) 时,可通过下述方式进行矩阵的乘法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np

c = np.array([[1,2,3],[4,5,6]])
d = np.array([[1,2],[3,4],[5,6]])
print(c)
# 输出:
# [[1 2 3]
# [4 5 6]]
print(d)
# 输出:
# [[1 2]
# [3 4]
# [5 6]]

# 操作数均为二维数组(矩阵)时,结果为矩阵的乘法
print(np.matmul(c,d))
# 输出:
# [[22 28]
# [49 64]]

# Python>=3.5时,NumPy的矩阵乘法可用@运算符
# 操作数均为二维数组(矩阵)时,结果为矩阵的乘法
print(c@d)
# 输出:
# [[22 28]
# [49 64]]

# 操作数均为二维数组(矩阵)时,结果为矩阵的乘法
print(c.dot(d))
# 输出:
# [[22 28]
# [49 64]]

统计分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import numpy as np

num = np.arange(12).reshape(2,6)
print(num)
# 输出:
# [[ 0 1 2 3 4 5]
# [ 6 7 8 9 10 11]]

# 最小值
print(num.min())
# 输出: 0

# 最大值
print(num.max())
# 输出: 11

# 求和
print(num.sum())
# 输出: 66

# 计算算术平均数
print(num.mean())
# 输出: 5.5

# 计算中位数
print(np.median(num))
# 输出: 5.5

# 计算标准差
print(np.std(num))
# 输出: 3.452052529534663

# 计算方差
print(np.var(num))
# 输出: 11.916666666666666

比较运算

比较运算符:会在数组上逐运算进行比较。并产生一个具有相同形状的布尔数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np

num = np.array([[4,-8,2],[-1,-9,4]])
print(num)
# 输出:
# [[ 4 -8 2]
# [-1 -9 4]]

print(num>0)
# 输出:
# [[ True False True]
# [False False True]]

print(num==4)
# 输出:
# [[ True False False]
# [False False True]]

数组查找

nonzero函数

返回数组中非零元素的索引信息。具体地:该函数的结果 使用多个索引数组来依次为各维度指定索引,然后通过元组将多个维度的索引数组组合到一起

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np

# 其中:np.inf 表示 无穷大,np.nan 表示 非数字
num = np.array([
[0,0,23,np.inf],
[48,0,np.nan,0]
])

print( np.nonzero(num) )
# 输出: (array([0, 0, 1, 1]), array([2, 3, 0, 2]))
# 解释:
# array([0, 0, 1, 1]) 表示非零元素的行索引
# array([2, 3, 0, 2]) 表示非零元素的列索引

print(num[0][2])
# 输出: 23.0

print(num[0][3])
# 输出: inf

print(num[1][0])
# 输出: 48.0

print(num[1][2])
# 输出: nan

argmin函数

返回数组中最小值的索引。当axis参数未指定时,则会将数组展平为一维数组进行查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np

num = np.array([
[61,19,23,21],
[38,27,26,72],
[48,37,16,25],
])

# 数组展平为一维数组的最小值的索引
print(np.argmin(num))
# 输出: 10

# 数组各列中最小值的索引
print(np.argmin(num, axis=0))
# 输出: [1 0 2 0]

# 数组各行中最小值的索引
print(np.argmin(num, axis=1))
# 输出: [1 2 2]

argmax函数

返回数组中最大值的索引。当axis参数未指定时,则会将数组展平为一维数组进行查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np

num = np.array([
[61,19,23,21],
[38,27,26,72],
[48,37,16,25],
])

# 数组展平为一维数组的最大值的索引
print(np.argmax(num))
# 输出: 7

# 数组各列中最大值的索引
print(np.argmax(num, axis=0))
# 输出: [0 2 1 1]

# 数组各行中最大值的索引
print(np.argmax(num, axis=1))
# 输出: [0 3 0]

nanargmin/nanargmax函数

由于np.nan值(非数字)的特殊性。故 argmin/argmax 函数的结果是第一个np.nan值的索引。而 nanargmin/nanargmax 函数在功能上与argmin/argmax函数一样,但在计算时会忽略np.nan值。当axis参数未指定时,则会将数组展平为一维数组进行查找

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np

num = np.array([-1, np.nan, 7, 2, np.nan, 6, 81])

print(np.argmin(num))
# 输出: 1
print(np.argmax(num))
# 输出: 1

print(np.nanargmin(num))
# 输出: 0
print(np.nanargmax(num))
# 输出: 6

argsort函数

返回数组中元素按升序排序的索引。axis参数默认值为-1,即最后一个轴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np

num = np.array(
[
[41,17,23,14],
[19,93,22,13]
]
)

# 数组中各列中按升序排序后的索引
sort_index_col = np.argsort(num, axis=0)
print(sort_index_col)
# 输出:
# [[1 0 1 1]
# [0 1 0 0]]

# 数组中各行中按升序排序后的索引
# 由于在二维数组中axis为1表示最后一个轴,故此处效果与 sort_index_row = np.argsort(num) 等价
sort_index_row = np.argsort(num, axis=1)
print(sort_index_row)
# 输出:
# [[3 1 2 0]
# [3 0 2 1]]

where函数

用于查找满足条件的元素,并返回这些元素的索引信息。具体地:该函数的结果:该函数的结果 使用多个索引数组来依次为各维度指定索引,然后通过元组将多个维度的索引数组组合到一起

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import numpy as np

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

index = np.where(num>3)
print(index)
# 输出: (array([0, 0, 1]), array([0, 2, 2]))
# 解释:
# array([0, 0, 1]) 表示满足条件的元素的行索引
# array([0, 2, 2]) 表示满足条件的元素的列索引

print(num[0][0])
# 输出: 5

print(num[0][2])
# 输出: 4

print(num[1][2])
# 输出: 6

此外,当同时提供三个参数 np.where(条件,x,y) 时,则会返回一个与原数组相同形状的数组。其中,满足指定条件的元素的位置处用x填充,不满足指定条件的元素的位置处用y填充

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np

num = np.array(
[
[5,3,4],
[1,2,6]
]
)
res = np.where(num>3, 996, -520)
print(res)
# 输出:
# [[ 996 -520 996]
# [-520 -520 996]]

argwhere函数

用于查找满足条件的元素,并返回这些元素的索引信息。但其与where函数返回结果的形式不同,其返回的是一个二维数组。其中,每一行是满足条件的元素的各维度索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy as np

num = np.array(
[
[5,3,4],
[1,2,6]
]
)
index = np.argwhere(num>3)
print(index)
# 输出:
# [[0 0]
# [0 2]
# [1 2]]
# 解释:
# 第1行: [0 0] 表示满足条件的某个元素的各维度索引
# 第2行: [0 2] 表示满足条件的某个元素的各维度索引
# 第3行: [1 2] 表示满足条件的某个元素的各维度索引

print(num[0][0])
# 输出: 5

print(num[0][2])
# 输出: 4

print(num[1][2])
# 输出: 6
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝