【numpy基础】--结构化

numpy,基础,结构化 · 浏览次数 : 51

小编点评

**numpy 数据类型** * **数值类型**:包括整数(`int`)、浮点数(`float`)和复杂数(`complex`)。 * **字符串类型**:用于存储文本。 * **对象类型**:用于存储对象的引用。 * **结构化类型**:用于定义自定义的数据类型。 **结构化数组** * 定义结构化数组时,需要定义数据类型。 * 两种定义方式: * **字典**:使用字典定义数据类型。 * **元组列表**:使用元组列表定义数据类型。 **其他** * numpy 也支持定义更复杂的结构化数组,例如包含多个列表的列表。 * 这些类型定义在 `np.dtype` 中。

正文

目前为止,介绍的numpy数组基本都是关于数值的,其实,numpy本身就是一个用于数值计算的基础库。

不过,除了数值计算之外,numpy也能够支持结构化数组

1. 关联不同类型数据

numpy的数组为了提高计算性能,要求数组的数据类型要一致。
但是现实情况下,我们经常遇到不是纯数值的数组,比如:

name = ["harry", "tom", "annie"]
sex = ["male", "male", "female"]
age = [40, 31, 14]

arr = np.array([name, sex, age])
print(arr)
#运行结果
[['harry' 'tom' 'annie']
 ['male' 'male' 'female']
 ['40' '31' '14']]

上面三个数组的类型不一致,放到一个numpy数组中时,可以看出,age数组被自动转换为字符串类型了。

为了保持 age 数组的原有数据类型,就要用到numpy结构化数组了。

arr = np.zeros(
    3,
    dtype={"names": ("name", "sex", "age"), 
           "formats": ("U10", "U10", "i4")},
)
print(arr)
#运行结果
[('', '', 0) ('', '', 0) ('', '', 0)]

arr["name"] = name
arr["sex"] = sex
arr["age"] = age
print(arr)
#运行结果
[('harry', 'male', 40) 
 ('tom', 'male', 31)
 ('annie', 'female', 14)]

定义数组时,定义不同的namesformats,这样,最后得到了结构化的数组,每个元素是一个元组元组中的三个元素分别是namesexage

这样的数组,保持了原数组的数据的类型。
补充:上面代码中的 U10 表示长度小于10 的字符串,i4 表示占4个字节的整数。

2. 结构化数组

生成结构化数组的关键在于定义不同的数据类型。
定义数据了类型有两种方式:
第一种是用字典,类似上面的示例那样,

dtp = np.dtype(
    {"names": ("name", "sex", "age"), 
     "formats": ("U10", "U10", "i4")}
)
arr = np.zeros(3, dtype=dtp)

arr["name"] = name
arr["sex"] = sex
arr["age"] = age
print(arr)
#运行结果
[('harry', 'male', 40) 
 ('tom', 'male', 31)
 ('annie', 'female', 14)]

还有一种方式是用元组列表来定义:

dtp = np.dtype([
    ("name", "U10"), 
    ("sex", "U10"),
    ("age", "i4")
])
arr = np.zeros(3, dtype=dtp)

arr["name"] = name
arr["sex"] = sex
arr["age"] = age
print(arr)
#运行结果
[('harry', 'male', 40) 
 ('tom', 'male', 31)
 ('annie', 'female', 14)]

两种方式定义出的结构化数组是一样的。

3. 更复杂的结构

除了定义上面那种类似excel表格的二维结构之外,numpy的数组也能定义跟复杂的结构。
比如定义学生的成绩列表:

dtp = np.dtype([("name", "U10"), ("scores", "f4", (3))])
arr = np.zeros(3, dtype=dtp)
print(arr)
#运行结果
[('', [0., 0., 0.]) 
 ('', [0., 0., 0.]) 
 ('', [0., 0., 0.])]

arr["name"] = ["harry", "tom", "annie"]
arr["scores"] = [[100, 95.5, 93], [89, 90, 78.5], [77.5, 76, 90]]
print(arr)
#运行结果
[('harry', [100. ,  95.5,  93. ]) 
 ('tom', [ 89. ,  90. ,  78.5])
 ('annie', [ 77.5,  76. ,  90. ])]

每个学生对应一个成绩列表,列表中包含3个成绩。

4. 总结回顾

总的来说,numpy结构化数组并不常用,对于结构化数组,使用 pandas库来操作更好。
numpy库一般作为纯数值计算的底层来使用,其实pandas也是基于 numpy 的。

此外,还有很多其他的python科学计算的库也是基于numpy的。

与【numpy基础】--结构化相似的内容:

【numpy基础】--结构化

目前为止,介绍的`numpy`数组基本都是关于数值的,其实,`numpy`本身就是一个用于数值计算的基础库。 不过,除了数值计算之外,`numpy`也能够支持**结构化数组**。 # 1. 关联不同类型数据 `numpy`的数组为了提高计算性能,要求数组的数据类型要一致。但是现实情况下,我们经常遇到

Pandas 使用教程 Series、DataFrame

[TOC] Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算) Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。 Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工

【pandas基础】--核心数据结构

pandas中用来承载数据的两个最重要的结构分别是: Series:相当于增强版的一维数组 DataFrame:相当于增强版的二维数组 pandas最大的优势在于处理表格类数据,如果数据维度超过二维,一般我们会使用另一个 python的库 numpy。 本篇主要介绍这两种核心数据结构的创建方式。 1

【numpy基础】--聚合计算

上一篇介绍的**通用计算**是关于多个`numpy`数组的计算, 本篇介绍的**聚合计算**一般是针对单个数据集的各种统计结果,同样,使用**聚合函数**,也可以避免繁琐的循环语句的编写。 # 元素的和 数组中的元素求和也就是合计值。 ## 调用方式 **聚合计算**有两种调用方式,一种是面向对象的

【numpy基础】--数组排序

`numpy` 数组通常是用于数值计算的多维数组,而排序功能可以快速、准确地对数据进行排序,从而得到更加清晰、易于分析的结果。 在数据分析和处理过程中,常常需要对数据进行排序,以便更好地理解和发现其中的规律和趋势。 排序会应用在很多场景中,比如: 1. 数据分类:将数据按照一定的特征进行分类,可以通

【numpy基础】--数组简介

`NumPy`(Numerical Python)是一个`Python`库,主要用于高效地处理多维数组和矩阵计算。它是科学计算领域中使用最广泛的一个库。 在`NumPy`中,**数组**是最核心的概念,用于存储和操作数据。 `NumPy`数组是一种多维数组对象,可以存储相同类型的元素,它支持高效的数

【numpy基础】--基础操作

`numpy`作为一个强大的数值计算库,提供了对多维数组的很多便捷操作。 承接上一篇数组的创建,本篇主要介绍一些数组的基本操作。 # 1. 子数组 首先介绍获取子数组的方法,提取已有数据的一部分来参与计算是比较常用的功能。 对于一维数组,提取子数组:`arr[start:stop:step]` 1.

【numpy基础】--通用计算

`numpy`提供了简单灵活的接口,用于优化数据数组的计算。 通用计算最大的优势在于通过向量化操作,将循环推送至`numpy`之下的编译层,从而取得更快的执行效率。 `numpy`的通用计算让我们计算数组时就像计算单独一个变量一样, 不用写循环去遍历数组中的各个元素。 比如,对于一般的`python

【numpy基础】--广播计算

`numpy`的广播计算是指在多维数组上进行的一种高效计算方式。 它可以将计算任务分配到每个维度上,并且可以在计算过程中进行数据共享和同步,从而提高计算效率和精度。 广播计算在数值计算、科学计算、机器学习等领域都有广泛的应用。 例如,在数值计算中,广播计算可以用于求解大规模的非线性方程组;在科学计算

【numpy基础】--数组过滤

在`numpy`中,数组可以看作是一系列数值的有序集合,可以通过下标访问其中的元素。处理数组的过程中,经常需要用到数组过滤功能。 过滤功能可以在处理数据时非常有用,因为它可以使数据更加干净和可读性更强。例如,在进行数据分析时,通常需要去除异常值,过滤掉不必要的元素可以使数据更加易于分析和处理。 `n