Numpy 结构化数组

Numpy 结构化数组,前面介绍了数组创建,在Numpy中,不仅可以创建规模和结构更加复杂的数组,叫做结构化数组,它包含的是结构或记录而不是独立的元素。

其他Numpy数组的创建可以参考极客教程NumPy 创建数组NumPy 从已有数组创建数组NumPy 从数值范围创建数组

结构化数组创建

可以创建一个简单的结构化数组,其中元素为结构体。可以用dtype选项指定一系列用逗号隔开的说明符,指明组成结构体的元素及它们的数组类型和顺序。如下所示:

bytes                 b1
int                   i1,i2,i4,i8
unsigned ints         u1,u2,u4,u8
floats                f2,f4,f8
complex               c8,c16
fixed length strings a<n>

我们可以创建由一个整数、一个长度为6的字符串、一个长度为4的float类型和一个长度为8位的复数类型组成的结构体,在dtype选项中按顺序指定各自的说明符,如下所示:

import numpy as np

structured = np.array([(1, 'First', 0.5, 1+2j), (2, 'Second', 1.3, 2-2j),
                       (3, 'Third', 0.8, 1+3j)], dtype=('i2, a6, f4, c8'))
print(structured)

输出结果如下:
在这里插入图片描述

我们可以在数组类型dtype选项中明确指定每个元素的类型,如int8,uint8,float16,complex64等,如下所示:

import numpy as np

structured = np.array([(1, 'First', 0.5, 1+2j), (2, 'Second', 1.3, 2-2j),
                       (3, 'Third', 0.8, 1+3j)], dtype=('int16, a6, float32, complex64'))
print(structured)

输出结果如下:
在这里插入图片描述

获取结构化数组的行和列

上述两种做法结果相同,生成的数组中,dtype序列包含结构体各项的名称及相应的数据类型。使用索引值,就能获取到包含相应结构体的行,如下所示:

import numpy as np

structured = np.array([(1, 'First', 0.5, 1+2j), (2, 'Second', 1.3, 2-2j),
                       (3, 'Third', 0.8, 1+3j)], dtype=('i2, a6, f4, c8'))
print(structured[1])

输出结果如下:

(2, b'Second', 1.3, 2.-2.j)

自动赋给结构体每个元素的名称可以看成数组列的名称,用它们作为结构化索引,就能引用类型相同或是位于同列的元素。

import numpy as np

structured = np.array([(1, 'First', 0.5, 1+2j), (2, 'Second', 1.3, 2-2j),
                       (3, 'Third', 0.8, 1+3j)], dtype=('i2, a6, f4, c8'))
print(structured['f1'])

输出结果如下:

[b'First' b'Second' b'Third']

如上所见,自动分配的名称的第一个字符f(field,字段),后面紧跟的是表示它在序列中位置的整数。其实,用更有意义的内容作为名字,用处更大。在创建数组时,可以指定各字段的名称。如下所示:

import numpy as np

structured = np.array([(1, 'First', 0.5, 1+2j), (2, 'Second', 1.3, 2-2j),
                       (3, 'Third', 0.8, 1+3j)],
                      dtype=[('id','i2'), ('position','a6'), ('value','f4'), ('complex', 'c8')])
print(structured['position'])

输出结果如下:

[b'First' b'Second' b'Third']

另一种方式就是创建完成后,重新定义结构化数组的dtype属性,在元组中指定各字段的名称,如下所示:

import numpy as np

structured = np.array([(1, 'First', 0.5, 1+2j), (2, 'Second', 1.3, 2-2j),
                       (3, 'Third', 0.8, 1+3j)], dtype=('i2, a6, f4, c8'))
structured.dtype.names = ('id', 'order', 'value', 'complex')
print(structured['order'])

输出结果如下:

[b'First' b'Second' b'Third']

相关文章参考:
NumPy 创建数组
Numpy 数组操作
NumPy 矩阵库(Matrix)

### NumPy结构化数组的创建与操作 #### 创建结构化数组NumPy中,可以通过定义复杂的`dtype`来创建结构化数组。这种数组可以存储不同类型的字段数据,类似于数据库中的表记录[^1]。 以下是创建结构化数组的一个简单例子: ```python import numpy as np # 定义结构化的 dtype dt = np.dtype([('name', 'U10'), ('age', 'int32'), ('height', 'float')]) # 使用 dtype 创建结构化数组 arr = np.array([("Alice", 25, 165.5), ("Bob", 30, 175.0)], dtype=dt) print(arr) ``` #### 转换结构化数组 如果需要将结构化数组转换为非结构化数组(即普通的二维数组),可以使用`numpy.lib.recfunctions.structured_to_unstructured`函数[^2]。 ```python from numpy.lib.recfunctions import structured_to_unstructured unstructured_arr = structured_to_unstructured(arr[['age', 'height']]) print(unstructured_arr) ``` #### 访问和筛选结构化数组 访问结构化数组中的特定列或字段时,可以直接通过字段名索引。例如: ```python ages = arr['age'] names = arr['name'] print(f"Ages: {ages}") print(f"Names: {names}") ``` 对于更复杂的条件查询,可以结合布尔掩码实现筛选。以下是一个示例,展示如何筛选年龄大于25岁的人员[^4]: ```python filtered_arr = arr[arr['age'] > 25] print(filtered_arr) ``` #### 修改和赋值 结构化数组支持字段之间的相互赋值以及跨字段的数据更新。需要注意的是,在执行此类操作时应确保数据类型兼容[^5]。 ```python new_dtype = [('first_name', 'U10'), ('last_name', 'U10')] updated_arr = np.empty(len(arr), dtype=new_dtype) # 假设原数组的名字字段包含全名,现在拆分为 first_name 和 last_name for i in range(len(arr)): full_name = arr[i]['name'].split() updated_arr[i]['first_name'] = full_name[0] updated_arr[i]['last_name'] = full_name[-1] print(updated_arr) ``` --- ### 性能优势与实际应用场景 结构化数组因其灵活性和高效性被广泛应用于科学计算领域。它能够有效处理混合型数据集,并提供接近C语言级别的内存效率[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值