NumPy - 唯一元素
什么是唯一元素?
唯一元素是指集合或集合中不同的值,每个值只出现一次。
换句话说,如果一个值出现多次,它只被算作唯一元素一次。例如,在集合 {1, 2, 2, 3, 4} 中,唯一元素为 {1, 2, 3, 4}。
NumPy 的 unique() 函数
NumPy 中的 unique() 函数返回数组中排序后的唯一元素。它会删除所有重复的值,只保留不同的值。
您还可以获取其他信息,例如唯一值的索引或其计数。以下是 NumPy 中 unique() 函数的基本语法 -
numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)
- ar: 要从中查找唯一元素的输入数组。
- return_index: 如果为 True,则还返回原始数组中唯一值首次出现的索引。
- return_inverse: 如果为 True,则还返回从唯一数组重建原始数组的索引。
- return_counts: 如果为 True,则还返回每个唯一值在原始数组中出现的次数。
- axis: 如果指定,则返回查找唯一值。如果为 None(默认值),则在扁平化数组中找到唯一值。
在一维数组中查找唯一元素
要查找一维数组中的唯一元素,只需将数组传递给 numpy.unique() 函数即可。
示例
在此示例中,numpy.unique() 函数查找并返回数组 data 中的唯一元素 -
import numpy as np # 创建一维数组 data = np.array([1, 2, 2, 3, 4, 4, 4, 5]) # 查找唯一元素 unique_elements = np.unique(data) print("唯一元素:", unique_elements)
以下是得到的输出 −
唯一元素: [1 2 3 4 5]
返回附加信息
numpy.unique() 函数还可以返回关于唯一元素的附加信息,例如它们首次出现的索引、用于重建原始数组的索引以及每个唯一值的计数。
这分别由 return_index、return_inverse 和 return_counts 参数控制。
返回首次出现的索引
获取唯一值首次出现的索引在原始数组中,将 return_index 参数设置为 True −
import numpy as np # 创建数组 data = np.array([1, 2, 2, 3, 4, 4, 4, 5]) # 查找唯一元素及其索引 unique_elements, indices = np.unique(data, return_index=True) print("唯一元素:", unique_elements) print("首次出现的索引:", indices)
这将产生以下结果 −
唯一元素:[1 2 3 4 5] 首次出现的索引:[0 1 3 4 7]
返回用于重建原始数组的索引
要获取可用于从唯一数组重建原始数组的索引,请将 return_inverse 参数设置为 True −
import numpy as np # 创建数组 data = np.array([1, 2, 2, 3, 4, 4, 4, 5]) # 查找唯一元素和逆索引 unique_elements, inverse_indices = np.unique(data, return_inverse=True) print("唯一元素:", unique_elements) print("逆索引:", inverse_indices)
以下是上述代码的输出 -
唯一元素:[1 2 3 4 5] 逆索引:[0 1 1 2 3 3 3 4]
返回唯一元素的计数
要获取原始数组中每个唯一值的计数,请将 return_counts 参数设置为True −
import numpy as np # 创建数组 data = np.array([1, 2, 2, 3, 4, 4, 4, 5]) # 查找唯一元素及其计数 unique_elements, counts = np.unique(data, return_counts=True) print("唯一元素:", unique_elements) print("唯一元素计数:", counts)
输出结果如下 −
唯一元素:[1 2 3 4 5] 唯一元素计数:[1 2 1 3 1]
多维数组中的唯一元素
numpy.unique() 函数也可用于在多维数组中查找唯一元素。默认情况下,该函数会先展平数组,然后查找唯一元素。
但是,您可以使用 axis 参数指定查找唯一值的轴。
默认行为(展平数组)
让我们看一个在二维数组中查找唯一元素的示例,无需指定轴 -
import numpy as np # 创建二维数组 data_2d = np.array([[1, 2, 2], [3, 4, 4], [4, 5, 5]]) # 查找唯一元素 unique_elements = np.unique(data_2d) print("唯一元素:", unique_elements)
此处,该函数展平了二维数组,然后查找唯一元素,如下图所示 -
唯一元素:[1 2 3 4 5]
沿特定轴查找唯一元素
您还可以沿特定轴查找唯一元素。例如,要查找二维数组中沿行(axis=1)或列(axis=0)的唯一元素 -
import numpy as np # 创建二维数组 data_2d = np.array([[1, 2, 2], [3, 4, 4], [4, 5, 5]]) # 查找沿轴 0(列)的唯一元素 unique_elements_axis_0 = np.unique(data_2d, axis=0) # 查找沿轴 1(行)的唯一元素 unique_elements_axis_1 = np.unique(data_2d, axis=1) print("沿轴 0 的唯一元素: ", unique_elements_axis_0) print("沿轴 1 的唯一元素: ", unique_elements_axis_1)
生成的结果如下 −
沿轴 0 的唯一元素: [[1 2 2] [3 4 4] [4 5 5]] 沿轴 1 的唯一元素: [[1 2] [3 4] [4 5]]
结构化数组中的唯一元素
NumPy 还支持结构化数组,其中每个元素可以是多个字段的组合。您可以通过指定要考虑唯一性的字段来查找结构化数组中的唯一元素。
示例
在此示例中,函数通过考虑所有字段在结构化数组中查找唯一元素 -
import numpy as np # 创建结构化数组 data_structured = np.array([(1, 'a'), (2, 'b'), (2, 'b'), (3, 'c')], dtype=[('num', 'i4'), ('char', 'U1')]) # 考虑所有字段查找唯一元素 unique_elements_structured = np.unique(data_structured) print("结构化数组中的唯一元素:", unique_elements_structured)
我们得到如下所示的输出 -
结构化数组中的唯一元素:[(1, 'a') (2, 'b') (3, 'c')]