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']