numpy.unique 及其参数含义

本文深入讲解了numpy.unique函数的使用方法及其参数含义,包括如何通过return_index、return_inverse和return_counts参数获取额外信息,以及如何利用axis参数处理多维数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

numpy.unique(arr, return_index=False, return_inverse=False, return_counts=False, axis=None)

对原始 array 去重,且返回排序好的 array

参数描述
return_index布尔值,如果为 True,则同时返回结果中的元素在原始 array 的位置下标
return_inverse布尔值,如果为 True,则我们可以根据它的返回值下标重构出原来的 array
return_counts布尔值,如果为 True,则同时返回结果中的元素在原始 array 出现的次数

因为涉及到排序,axis 参数的用法有点 confusing,稍后介绍。不指定 axis 参数,将会对 arr 中所有元素进行操作,相当于把原始 array 展平(如果是多维的话)。

我们先结合这几个参数,来看几个例子。

import numpy as np

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
np.unique(names)
"""
array(['Bob', 'Joe', 'Will'], dtype='<U4')
"""

这与下面的表达是等价的:

sorted(set(names))
"""
['Bob', 'Joe', 'Will']
"""

我们使用 return_index 参数:

ints = np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
uints, indices = np.unique(ints, return_index=True)
uints
"""
array([1, 2, 3, 4])
"""

indices
"""
array([5, 3, 0, 7], dtype=int64)
"""

原始 array ints 中下标为 [5, 3, 0, 7] 的位置对应的元素确实为 [1, 2, 3, 4]。注意,这里选择的是重复元素中最左边的元素。


再来看 return_inverse 参数:

uints, indices = np.unique(ints, return_inverse=True)

uints
"""
array([1, 2, 3, 4])
"""

indices
"""
array([2, 2, 2, 1, 1, 0, 0, 3, 3], dtype=int64)
"""

根据 indices 提供的下标我们在 uints 中取值,这里用到了 NumPy 的 fancy indexing:

uints[indices]
"""
array([3, 3, 3, 2, 2, 1, 1, 4, 4])
"""

return_counts 参数:

uints, counts = np.unique(ints, return_counts=True)

uints
"""
array([1, 2, 3, 4])
"""

counts
"""
array([2, 2, 3, 2], dtype=int64)
"""

最后我们来看 axis 参数。我们可以直观的这样理解,对于多维数组,axis=0 会返回 unique 的行,而 axis=1会返回 unique 的列:

np.unique(np.array([[1, 0, 0], [1, 0, 0], [2, 0, 0]]), axis=0)
"""
array([[1, 0, 0],
       [2, 0, 0]])
"""
np.unique(np.array([[1, 0, 0], [1, 0, 0], [2, 0, 0]]), axis=1)
"""
array([[0, 1],
       [0, 1],
       [0, 2]])
"""

注意到在 axis=1 时,对去重结果排序后,列的顺序与原来的顺序已经不一样了。下面再看两个类似的例子:

a = np.array([[1, 2, 6], [1, 0, 5], [2, 3, 4]])
a
"""
array([[1, 2, 6],
       [1, 0, 5],
       [2, 3, 4]])
"""

np.unique(a, axis=1)
"""
array([[1, 2, 6],
       [1, 0, 5],
       [2, 3, 4]])
"""
np.unique(a, axis=0)
"""
array([[1, 0, 5],
       [1, 2, 6],
       [2, 3, 4]])
"""

我们注意到,在下面 axis=0 的情况中,返回的结果中前两行位置互换了。这是最后排序的结果,使用的是 lexsort(可看这篇文章《NumPy 中的排序方法》)。前两行的第一个元素都为 1,而第二个元素 0 < 2,因此第二行会排到第一行前面。

axis=1时,因为每列的第一个元素已经是有序的了,所以结果并未改变。

<think>好的,用户现在想了解如何统计`np.unique(b)`的个数。之前他们遇到了关于numpy数组没有`value_count`属性的错误,现在可能是在进一步处理数据时的问题。 首先,我需要确认用户的具体需求。`np.unique(b)`本身会返回唯一值和对应的计数,如果用户已经知道这个函数,可能他们想更详细地了解如何获取计数部分,或者可能有其他统计需求。比如,他们可能误解了`np.unique`返回的结果,或者想用不同的方法来实现同样的功能。 回顾之前的对话,用户之前混淆了NumPy和Pandas的方法,所以需要强调NumPy的函数和Pandas的区别。用户可能已经将数据转换为NumPy数组,现在需要统计唯一值的数量,但可能对如何正确使用`np.unique`的参数不熟悉。 接下来,我应该分步骤解释如何使用`np.unique`的`return_counts`参数来获取唯一值及其出现次数。同时,提供示例代码,说明如何单独获取唯一值的数量,或者统计总共有多少个唯一值。可能用户还需要知道如何将这些结果结合起来进行分析,比如显示每个值及其对应的次数。 另外,用户可能会想知道除了使用`np.unique`之外,是否有其他方法,比如转换为Pandas的Series后使用`value_counts`,这样可能更直观。不过考虑到用户之前的问题是关于NumPy数组的,可能他们更倾向于使用NumPy的解决方案,但提供替代方法也是有帮助的。 还需要检查是否有常见的错误场景,例如用户可能忘记添加`return_counts=True`参数,导致只得到唯一值而没有计数。或者可能误用了返回的元组结构,没有正确解包变量。这时候需要强调参数的正确使用和返回值的处理方式。 最后,总结关键点,确保用户理解如何正确使用`np.unique`来统计个数,并提醒他们注意参数的使用和数据类型的转换。可能还需要对比NumPy和Pandas的方法,帮助用户根据具体情况选择合适的方法。</think>要统计 NumPy 数组 `b` 中唯一值的出现次数,可以使用 `np.unique()` 函数的 `return_counts` 参数。以下是具体步骤和解释: --- ### **1. 核心方法:`np.unique(return_counts=True)`** 直接调用 `np.unique()` 并设置 `return_counts=True`,**一次性获取唯一值和对应的频次**: ```python import numpy as np b = np.array([1, 2, 2, 3, 3, 3, 4]) unique_values, counts = np.unique(b, return_counts=True) print("唯一值:", unique_values) # 输出: [1 2 3 4] print("对应频次:", counts) # 输出: [1 2 3 1] ``` --- ### **2. 统计唯一值总数** 如果只需要知道**有多少个不同的唯一值**,直接取 `unique_values` 的长度: ```python num_unique = len(unique_values) print("唯一值个数:", num_unique) # 输出: 4 ``` --- ### **3. 扩展应用:统计每个值的占比** 结合频次数据,可以计算每个唯一值的占比: ```python total = len(b) # 数组总长度 proportions = counts / total print("占比:", proportions) # 输出: [0.14285714, 0.28571429, 0.42857143, 0.14285714] ``` --- ### **4. 对比 Pandas 的 `value_counts()`** 如果数据已经是 Pandas 的 `Series`,可以直接用 `value_counts()`: ```python import pandas as pd series = pd.Series(b) counts_pandas = series.value_counts().sort_index() # 按唯一值排序 print(counts_pandas) ``` --- ### **5. 常见问题** - **忘记 `return_counts=True`**: 如果未设置此参数,`np.unique(b)` 只会返回唯一值,不包含频次。 - **数据类型限制**: `np.unique()` 适用于数值型数组,若数组包含非数值类型(如字符串),需确保类型一致性。 --- ### **总结** - **核心语法**:`unique_values, counts = np.unique(b, return_counts=True)` - **关键参数**:`return_counts=True` 是统计频次的核心开关 - **适用场景**:快速统计数值型数组中唯一值的分布情况 通过这种方法,你可以高效地分析 NumPy 数组中的数据分布特征!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如松茂矣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值