published on in Python

数据分析・多维数组的数值操作

返回教程主页

上篇 数据分析・操作环境准备

数组结构可以快速有序的处理一系列的数据。因此,在处理数据的时候常常要用到数组或多维数组,一个常用的例子就是在处理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

下篇 数据分析・数据可视化