images/blog-posts

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

返回教程主页

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

数组结构可以快速有序的处理一系列的数据。因此,在处理数据的时候常常要用到数组或多维数组,一个常用的例子就是在处理Excel表格数据的时候将其表示为二维数组。

构建numpy数组

假设我们有如下表格数据:

序号表列A表列B表列C
11.12.13.1
21.22.23.2
31.32.33.3
41.42.43.4

我们关心的是数值区域的内容:

1.12.13.1
1.22.23.2
1.32.33.3
1.42.43.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

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

SUBSCRIBE


🔒 No spam. Unsubscribe any time.

About kk

kk

Vincenzo Antedoro is an engineer who helps those who want to invest in renewables. For the rest he enjoys teaching with the method of learning by doing..

» More about kk