NumPy - 创建结构化数组



结构化数组简介

NumPy 中的结构化数组允许在单个数组中表示不同类型和大小的数据。结构化数组中的每个元素都可以是具有多个字段的记录,每个字段都有自己的数据类型。

这类似于拥有一个表格,其中每一行代表一个具有各种属性的记录。主要要点如下:

  • 结构化数组中的每个元素(记录)可以有多个字段。
  • 字段可以具有不同的数据类型(例如,整数、浮点数、字符串)。
  • 结构化数组可用于表示复杂的数据结构。

定义结构化数组

创建结构化数组的第一步是为结构化数组定义数据类型。这使用 NumPy 的dtype对象完成,该对象指定数组中字段的名称和类型,如下例所示:

import numpy as np

# Define the data type for the structured array
dtype = np.dtype([('name', 'U10'), ('age', 'i4'), ('height', 'f4')])

这里,dtype是一个结构化数据类型,具有三个字段:

  • name: 最多 10 个字符的字符串 ('U10')
  • age: 一个整数 ('i4')
  • height: 一个浮点数 ('f4')

创建结构化数组

定义好“dtype”后,可以通过将 dtype 传递给 np.array() 函数来创建结构化数组。以下是语法:

numpy.array(
   object, 
   dtype=None, 
   copy=True, 
   order='K', 
   subok=False, 
   ndmin=0
)

其中,

  • object: 这是您要转换为 NumPy 数组的输入数据。它可以是列表、元组或任何其他类似序列的结构。
  • dtype (可选): 指定数组所需的数据类型。如果未提供,NumPy 将从输入数据推断数据类型。例如,您可以使用 'int32'、'float64'、'str' 等。
  • copy (可选): 如果为 True(默认值),则创建一个新数组。如果为 False,则仅在必要时创建新数组(即,如果输入对象本身不是数组)。如果为 False,则 np.array 可能在可能的情况下返回原始数组的视图。
  • order (可选): 指定内存布局顺序。它可以是 'C' 表示行主序(C 样式)顺序,'F' 表示列主序(Fortran 样式)顺序,或 'K' 表示输入中找到的顺序。默认值为 'K'。
  • subok (可选): 如果为 True,则如果输入是子类,则将使用 ndarray 的子类。默认值为 False,这意味着返回的数组将始终是 ndarray 的实例。
  • ndmin (可选): 指定结果数组应具有的最小维度数。例如,将 ndmin 设置为 2 可确保结果至少为二维数组。

示例

在下面的示例中,我们正在定义一个结构化数组,其指定的 dtype 包括“name”、“age”和“height”的字段。然后我们使用与该结构匹配的数据创建数组,并打印结果结构化数组:

import numpy as np

# Define the dtype with field names and data types
dtype = [('name', 'U10'), ('age', 'i4'), ('height', 'f4')]

# Create data consistent with the dtype
data = [('Alice', 30, 5.6), ('Bob', 25, 5.8), ('Charlie', 35, 5.9)]

# Create the structured array
structured_array = np.array(data, dtype=dtype)
print("Structured Array:\n", structured_array)

获得以下输出:

Structured Array:
[('Alice', 30, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]

使用不同的数据类型创建结构化数组

您可以根据应用程序的需求创建具有各种数据类型(包括字符串、整数和浮点数)的结构化数组。

在结构化数组的上下文中:

  • 字符串: 您可以在结构化数组中存储文本数据。例如,名称字段可以使用字符串数据类型。
  • 整数: 数值数据(如年龄或计数)可以存储为整数。这可能包括年龄或数量等数据,它们是整数。
  • 浮点数: 对于十进制数或实数,您可以使用浮点数据类型。这对于测量或任何需要精度的值(例如身高或体重)很有用。

示例

在下面的示例中,我们正在创建一个结构化数组,其数据类型 (dtype) 包括混合数据类型:整数表示 ID、字符串表示名称以及浮点数表示分数:

import numpy as np

# Define a dtype with mixed data types
dtype = [('id', 'i4'), ('name', 'U15'), ('score', 'f8')]
data = [(1, 'Alice', 88.5), (2, 'Bob', 91.2), (3, 'Charlie', 85.4)]

# Create the structured array
structured_array = np.array(data, dtype=dtype)
print("Structured Array with Mixed Data Types:\n", structured_array)

这将产生以下结果:

Structured Array with Mixed Data Types:[(1, 'Alice', 88.5) (2, 'Bob', 91.2) (3, 'Charlie', 85.4)]

使用元组列表创建结构化数组

您可以使用元组列表定义 dtype 并创建结构化数组,其中每个元组表示一个字段。每个元组包含两个元素:第一个元素是字段的名称,第二个元素是该字段的数据类型。

示例

在下面的示例中,我们正在使用指定的 dtype 定义一个具有“name”、“age”和“height”字段的结构化数组。然后我们使用相应的数据创建此数组:

import numpy as np

# Define the dtype
dtype = [('name', 'U10'), ('age', 'i4'), ('height', 'f4')]

# Define the data
data = [('Alice', 30, 5.6), ('Bob', 25, 5.8), ('Charlie', 35, 5.9)]

# Create the structured array
structured_array = np.array(data, dtype=dtype)

print("Structured Array:\n", structured_array)

获得以下输出:

Structured Array:
[('Alice', 30, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]

使用字典创建结构化数组

或者,您可以使用字典定义数据和 dtype 以清楚地指定字段的名称和类型。字典中的每个键都代表一个字段名称,与每个键关联的值定义该字段的数据类型。

示例

在此示例中,我们使用字典格式定义结构化数组的 dtype 以指定“name”、“age”和“height”的字段。然后我们创建并显示此结构化数组及其对应的数据,将其组织成支持每个记录中多种数据类型的格式:

import numpy as np

# Define the dtype using a dictionary
dtype = np.dtype([('name', 'U10'), ('age', 'i4'), ('height', 'f4')])

# Define the data
data = [('Alice', 30, 5.6), ('Bob', 25, 5.8), ('Charlie', 35, 5.9)]

# Create the structured array
structured_array = np.array(data, dtype=dtype)

print("Structured Array from Dictionary:\n", structured_array)

这将产生以下结果:

Structured Array from Dictionary:
[('Alice', 30, 5.6) ('Bob', 25, 5.8) ('Charlie', 35, 5.9)]
广告