数组结构可以快速有序的处理一系列的数据。因此,在处理数据的时候常常要用到数组或多维数组,一个常用的例子就是在处理Excel表格数据的时候将其表示为二维数组。
构建numpy数组
假设我们有如下表格数据:
序号 | 表列A | 表列B | 表列C |
---|---|---|---|
1 | 1.1 | 2.1 | 3.1 |
2 | 1.2 | 2.2 | 3.2 |
3 | 1.3 | 2.3 | 3.3 |
4 | 1.4 | 2.4 | 3.4 |
我们关心的是数值区域的内容:
1.1 | 2.1 | 3.1 |
1.2 | 2.2 | 3.2 |
1.3 | 2.3 | 3.3 |
1.4 | 2.4 | 3.4 |
使用numpy数组来存储它:
import numpy as np
data = [
[1.1, 2.1, 3.1],
[1.2, 2.2, 3.2],
[1.3, 2.3, 3.3],
[1.4, 2.4, 3.4],
]
array2d = np.array(data)
print(array2d.shape, array2d.dtype)
print(array2d)
运行后输出:
(4, 3) float64
[[1.1 2.1 3.1]
[1.2 2.2 3.2]
[1.3 2.3 3.3]
[1.4 2.4 3.4]]
在上述代码中我们将一个“二维”的序列结构「例如: list, tuple」转换成了numpy的二维数组。
使用numpy数组的.shape
属性可以查看数组的维度信息,从运行输出可以看出这是一个4行3列的numpy数组;使用numpy数组的.dtype
属性可以查看数组的类型信息,从运行结果可以看出numpy数组的元素数值类型为64位浮点型。
用类似的方法我们也可以创建其它维度的numpy数组,例如:
dim1 = np.array([1, 2, 3])
print(dim1.shape)
dim3 = np.array([[[1] * 3] * 3] * 3)
print(dim3.shape)
除了将list,tuple这类序列结构转换为numpy数组的创建方法,我们还可以直接初始化一个numpy数组。
初始化一个3行4列的numpy数组,其中的每一个元素的值都为0,且值的类型为float:
zeros = np.zeros((3, 4), dtype=float)
初始化一个3行4列的numpy数组,其中的每一个元素的值都为1,且值的类型为int:
ones = np.ones((3, 4), dtype=int)
numpy数组的索引
numpy数组可以直接在多个维度上进行索引操作,例如arr[0, 1, 2]
表示先取出arr的第0个子数组A「假定为A」,然后取A的第1个子数组B「假定为B」,最后取出B的第2个子数组。
为了方便理解,我们举个例子。现在假设二维数组就是表格,那么三维数组则代表一组表格。现在我们有一组表格G,G[0]
表示该组的第0张表格;G[0, 1]
表示第0张表格的第1行;G[0, 1, 2]
表示第0张表格的第1行的第2列。
G = np.array([[
[1.1, 2.1, 3.1],
[1.2, 2.2, 3.2],
[1.3, 2.3, 3.3],
[1.4, 2.4, 3.4],
]] * 5)
print(G.shape)
print(G[0, 1, 2])
运行后输出:
(5, 4, 3)
3.2
通过索引我们可以对数组进行批量计算和赋值:
G = np.array([[
[1.1, 2.1, 3.1],
[1.2, 2.2, 3.2],
[1.3, 2.3, 3.3],
[1.4, 2.4, 3.4],
]] * 5)
G[1] += 1
G[2] += 2
print(G[0, 1, 2])
print(G[1, 1, 2])
print(G[2, 1, 2])
运行后输出:
3.2
4.2
5.2
冒号:
作为索引号表示某维度的全体成员,例如G[0, 1, 2]
表示0号表格第1行第2列而G[0, :, 2]
表示0号表格每一行的第2列。
求和、求平均
下面介绍一下如何在numpy数组中求和、求平均。
我们使用如下二维数组来做示范:
table = np.array([
[1.1, 2.1, 3.1],
[1.2, 2.2, 3.2],
[1.3, 2.3, 3.3],
[1.4, 2.4, 3.4],
])
求和:
_sum = table.sum()
print(_sum)
运行后输出:
26.999999999999996
先索引,然后求和,如:
print(table[0].sum())
print(table[:, 0].sum())
运行后输出:
6.300000000000001
5.0
求平均:
mean = table.mean()
print(mean)
运行后输出:
2.2499999999999996
先索引,然后求平均,如:
print(table[0].mean())
print(table[:, 0].mean())
运行后输出:
2.1
1.25