9.11 结构化数据:NumPy 的结构化数组

本节是《Python 数据科学手册》(Python Data Science Handbook)的摘录。

译者:飞龙

协议:CC BY-NC-SA 4.0

虽然我们的数据通常可以通过同构数组来很好地表示,但有时并非如此。 本节演示了 NumPy 结构化数组和记录数组的用法,它们为复合异构数据提供了有效的存储。 虽然这里展示的模式对于简单操作很有用,但像这样的场景通常适合使用 Pandas Dataframe,我们将在第三章中探索。

import numpy as np

想象一下,我们有很多人的多个数据类别(比如姓名,年龄和体重),我们希望存储这些值以便在 Python 程序中使用。可以将它们存储在三个独立的数组中:

name = ['Alice', 'Bob', 'Cathy', 'Doug']
age = [25, 45, 37, 19]
weight = [55.0, 85.5, 68.0, 61.5]

但这有点笨拙。 这里没有任何东西告诉我们三个数组是相关的;如果我们可以使用单一结构来存储所有这些数据,那将更自然。NumPy 可以使用结构化数组处理这个问题,结构化数组是具有复合数据类型的数组。

回想一下,之前我们使用这样的表达式创建了一个简单的数组:

x = np.zeros(4, dtype=int)

我们可以使用复合数据类型规范,以相似方式创建结构化数组:

# 使用结构化数组的复合数据类型
data = np.zeros(4, dtype={'names':('name', 'age', 'weight'),'formats':('U10', 'i4', 'f8')})
print(data.dtype)# [('name', '<U10'), ('age', '<i4'), ('weight', '<f8')]

这里'U10'表示“最大长度为 10 的 Unicode 字符串”,'i4'表示 4 字节(即 32 位)整数,'f8'表示 8 字节(即 64 位)浮点数。我们将在下一节中讨论这些类型代码的其他选项。

现在我们已经创建了一个空的容器数组,我们可以使用我们的值列表填充数组:

data['name'] = name
data['age'] = age
data['weight'] = weight
print(data)'''
[('Alice', 25, 55.0) ('Bob', 45, 85.5) ('Cathy', 37, 68.0)('Doug', 19, 61.5)]
'''

正如我们所希望的那样,数据现在被安排在一个方便的内存块中。结构化数组的便利之处在于,你现在可以通过索引或名称来引用值:

# 获取所有名称
data['name']'''
array(['Alice', 'Bob', 'Cathy', 'Doug'], dtype='<U10')
'''# 获取数据的第一行
data[0]# ('Alice', 25, 55.0)# 获取最后一行的名称
data[-1]['name']# 'Doug'

使用布尔掩码,你甚至可以执行一些更复杂的操作,例如过滤年龄:

# 获取年龄小于 30 的名称
data[data['age'] < 30]['name']'''
array(['Alice', 'Doug'], dtype='<U10')
'''

请注意,如果你想进行任何比这些更复杂的操作,你应该考虑下一章中介绍的 Pandas 包。正如我们所看到的,Pandas 提供了Dataframe对象,它是一个构建在 NumPy 数组上的结构,它提供了各种有用的数据操作功能,类似于我们在这里展示的东西,以及更多。

创建结构化数组

可以通过多种方式规定结构化数组数据类型。之前,我们见过了字典方法:

np.dtype({'names':('name', 'age', 'weight'),'formats':('U10', 'i4', 'f8')})# dtype([('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])

为清楚起见,可以使用 Python 类型或 NumPy dtype来指定数字类型:

np.dtype({'names':('name', 'age', 'weight'),'formats':((np.str_, 10), int, np.float32)})# dtype([('name', '<U10'), ('age', '<i8'), ('weight', '<f4')])

复合类型也可以指定为元组列表:

np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f8')])# dtype([('name', 'S10'), ('age', '<i4'), ('weight', '<f8')])

如果类型的名称对你无关紧要,则可以在逗号分隔的字符串中单独指定类型:

np.dtype('S10,i4,f8')# dtype([('f0', 'S10'), ('f1', '<i4'), ('f2', '<f8')])

缩短的字符串格式代码可能看起来令人困惑,但它们建立在简单的原则之上。第一个(可选)字符是<>,分别表示“小端”或“大端”,并规定了有效位的顺序约定。下一个字符指定数据类型:字符,字节,整数,浮点等(参见下表)。最后一个或多个字符表示对象的大小(以字节为单位)。

字符 描述 示例
'b' 字节 np.dtype('b')
'i' 符号整数 np.dtype('i4') == np.int32
'u' 无符号整数 np.dtype('u1') == np.uint8
'f' 浮点 np.dtype('f8') == np.int64
'c' 复数浮点 np.dtype('c16') == np.complex128
'S', 'a' 字符串 np.dtype('S5')
'U' Unicode 字符串 np.dtype('U') == np.str_
'V' 原始数据(void) np.dtype('V') == np.void

更高级的复合类型

可以定义更高级的复合类型。例如,你可以创建一个类型,其中每个元素包含一个数组或矩阵。在这里,我们将创建一个带有mat成分的数据类型,该成分由3x3浮点矩阵组成:

tp = np.dtype([('id', 'i8'), ('mat', 'f8', (3, 3))])
X = np.zeros(1, dtype=tp)
print(X[0])
print(X['mat'][0])'''
(0, [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]])
[[ 0.  0.  0.][ 0.  0.  0.][ 0.  0.  0.]]
'''

现在X数组中的每个元素都包含一个id和一个3x3矩阵。为什么要使用它而不是简单的多维数组,或者 Python 字典呢?原因是这个 NumPy dtype直接映射到 C 结构定义,因此包含数组内容的缓冲区,可以在适当编写的 C 程序中直接访问。

如果你发现自己为处理结构化数据的遗留 C 或 Fortran 库编写 Python 接口,你可能会发现结构化数组非常有用!

记录数组:略有不同的结构化数组

NumPy 还提供了np.recarray类,它与刚刚描述的结构化数组几乎相同,但有一个附加功能:字段可以作为属性而不是字典的键来访问。

回想一下,我们以前写过:

data['age']# array([25, 45, 37, 19], dtype=int32)

如果我们将数据视为记录数组,我们可以通过更少的敲键盘来访问它:

data_rec = data.view(np.recarray)
data_rec.age# array([25, 45, 37, 19], dtype=int32)

缺点是对于记录数组,即使使用相同的语法,访问字段会有一些额外的开销。 我们在这里可以看到:

%timeit data['age']
%timeit data_rec['age']
%timeit data_rec.age'''
1000000 loops, best of 3: 241 ns per loop
100000 loops, best of 3: 4.61 µs per loop
100000 loops, best of 3: 7.27 µs per loop
'''

更方便的记号是否值得额外开销,取决于你自己的应用。

转向 Pandas

关于结构化和记录数组的这一部分,有意放在本章的最后部分,因为它很好地介绍了我们将要介绍的下一个包:Pandas。

在某些情况下,最好了解这里讨论的结构化数组,特别是在你使用 NumPy 数组来映射到 C,Fortran 或其他语言的二进制数据格式的情况下。

对于结构化数据的日常使用,Pandas 包是一个更好的选择,我们将在下一章中深入讨论它。

数据科学 IPython 笔记本 9.11 结构化数据:NumPy 的结构化数组相关推荐

  1. 数据科学 IPython 笔记本 8.11 多个子图

    8.11 多个子图 原文:Multiple Subplots 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Python Data Science ...

  2. 数据科学 IPython 笔记本 7.11 聚合和分组

    7.11 聚合和分组 原文:Aggregation and Grouping 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Python Data ...

  3. 数据科学 IPython 笔记本 翻译完成

    原文:donnemartin/data-science-ipython-notebooks 译者:飞龙 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以 ...

  4. 数据科学 IPython 笔记本 8.4 简单的折线图

    8.4 简单的折线图 原文:Simple Line Plots 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Python Data Scienc ...

  5. 数据科学 IPython 笔记本 8.3 Matplotlib 可视化

    8.3 Matplotlib 可视化 原文:Visualization with Matplotlib 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册> ...

  6. 数据科学 IPython 笔记本 7.15 高性能 Pandas

    # 7.15 高性能 Pandas:eval()和query() 原文:High-Performance Pandas: eval() and query() 译者:飞龙 协议:CC BY-NC-SA ...

  7. 数据科学 IPython 笔记本 7.14 处理时间序列

    7.14 处理时间序列 原文:Working with Time Series 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Python Dat ...

  8. 数据科学 IPython 笔记本 7.4 Pandas 对象介绍

    7.4 Pandas 对象介绍 原文:Introducing Pandas Objects 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Pyth ...

  9. 数据科学 IPython 笔记本 7.3 Pandas 数据操作

    7.3 Pandas 数据操作 原文:Data Manipulation with Pandas 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(P ...

最新文章

  1. SSH框架搭建的时候遇到的问题
  2. java tree json,基于jstree使用JSON数据组装成树
  3. C#工业物联网和集成系统解决方案的技术路线
  4. python用途适合做什么生意-PureQuant数字货币量化交易程序化交易python量化开源框架...
  5. Centos7.8系统安装dkms
  6. ios平台实现视频H264硬编码及软编码(附完整demo)
  7. 《关于长沙.NET技术社区未来发展规划》问卷调查结果公布
  8. 2021-07-01 <1000+常用Python库>
  9. 水泥路面、桥梁基建、隧道裂痕裂缝检测数据集
  10. 数学建模--数理统计
  11. mysql定时执行任务
  12. linux可以挂载nas盘吗_linux可以挂载nas盘吗
  13. 像素格式结构-PIXELFORMATDESCRIPTOR
  14. Python VTK numpy数据3D可视化
  15. npm ERR! code ERESOLVEnpm ERR! ERESOLVE could not resolvenpm ERR! npm ERR! While resolving: @vue/
  16. 2022年生物医用膜市场前景分析及研究报告
  17. 计算机职业技术教育,计算机职业教育论文
  18. 【论文阅读】Density estimation using Real NVP
  19. mysql mysqldump导出数据
  20. Element-ui中el-tabs的下划线样式微调

热门文章

  1. (33)FPGA原语设计(BUFGCE)
  2. FPGA 常用AXI总线介绍
  3. (6)verilog语言编写售货机
  4. Xilinx PLL IP核功能仿真
  5. python单词去重及排序_Python实现对文件进行单词划分并去重排序操作示例
  6. plsql提示列快捷键_PLsql快捷键
  7. 计算机基础与应用 是学什么,计算机基础与应用教学大纲
  8. mysql to_minute_mysql的时间转化
  9. 《深入理解分布式事务》第八章 TCC 分布式事务原理
  10. redis压力测试工具-----redis-benchmark