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)

输出结果如下:
Numpy 结构化数组

我们可以在数组类型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)

输出结果如下:
Numpy 结构化数组

获取结构化数组的行和列

上述两种做法结果相同,生成的数组中,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']

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程