NumPy基础-结构化数组(二)

61 阅读4分钟

对结构化数组进行索引和赋值

将数据分配给结构化数组

有多种方法可以将值分配给结构化数组:使用Python元组、使用标量值或使用其它结构化数组。

从Pyhton元组分配

将值分配给结构化数组的最简答方法是使用Python元组,每个分配的值都应是一个长度等于数组中字段数的元组,而不是列表或数组,因为它们将触发NumPy的广播规则。元组的元素从左到右分配给数组的连续字段:

标量分配

分配给结构化元素的标量将分配给所有字段,当将标量分配给结构化数组或将非结构化数组分配给结构化数组时,则会发生这种情况:

也可以将结构化数组分配给非结构化数组,但前提是结构化数据类型只有一个字段:

从其它结构化数组分配

在两个结构化数组之间进行赋值,就好像源元素已经转换为元组,然后再分配给目标元素一样。也就是说,无论字段名称如何,将源数组的第一个字段分配给目标数组的第一个字段,将第二个字段分配给目标数组的第一个字段,依此类推,字段数不同的结构化数组不能相互匹配,未包含在任何字段中的目标结构的字节不受影响。

涉及子数组的分配

当分配给子数组的字段时,分配的值将首先被广播到子数组的形状。

索引结构化数组

访问单个字段

通过使用字段名称对数组进行索引,可以访问和修改结构化数组的各个字段。

生成的数组是原始数组的视图,它共享相同的内存位置写入视图将修改原始数组。

该视图与索引字段具有相同的dtype和项大小,因此除了嵌套结构外,它通常是非结构化数组。

如果访问的字段是子数组,则将子数组的尺寸附加到结果的形状上:

访问多个字段

可以索引并分配给具有多字段索引的结构化数组,其中索引是字段名称的列表。

使用多字段索引建立索引的结果是原始数组的视图,例如:

分配给视图会修改原始数组,视图的字段将按照它们被索引的顺序。与单字段索引不同,视图dtype与原始数组具有相同的项目大小,并且其字段与原始数组具有相同的偏移量,而未索引的字段仅会丢失。

分配给具有多字段索引的数组会修改原始数组:

这符合上述机构化数组分配规则,例如,这意味着可以使用适当的多字段索引交换两个字段的值:

用整数索引以获得结构化标量

索引结构化数组的单个元素(使用整数索引)将返回结构化标量:

与其它的NumPy标量不同,结构化标量是可变的,并且像原始数组中的视图一样工作,因此修改标量将修改原始数组。结构化标量还支持按字段名称进行访问和分配:

与元组类似,结构化标量也可以使用整数索引:

因此,元组可能被视为等同于NumPy的结构化类型的原生Python,就像原生Python整数等效于NumPy的整数类型一样。可以通过调用numpy.ndarray.item将结构化标量转换为元组:

查看包含对象的结构化数组

为了防止破坏对象类型字段中的对象指针,NumPy目前不允许视图包含对象的结构化数组。

结构对比

如果两个无效结构化数组的dtype相等,则测试数组的相等性将得到一个布尔数组,其数组的大小与原始数组的大小相同,而元素设置为True,对应结构的所有字段均相等。如果字段名称、dtype和标题相同(忽略字节序)且字段的顺序相同,则结构化dtype相等。

当前,如果两个无效结构化数组的dtype不相等,则比较失败,返回标量值False。

在比较无效结构数组时,操作符总是返回False,不支持算术和位操作。

如果你想学习Python,但是找不到学习路径和资源,欢迎来指尖编程