`numpy.unique` 应用于矩阵时的计数解释

3

numpy.unique有一个可选参数return_counts。从文档中可以看到:

return_counts bool, 可选项 如果为True,则返回每个独特项目在ar中出现的次数。

版本1.9.0中新增。

对于一维数组很容易理解。但是,我正在尝试获取矩阵每行的唯一值和计数。以下是一个样例矩阵:

m_sample = np.array([
    [1, 2, 1],
    [2, 2, 2],
    [3, 3, 3],
    [1, 4, 5],
])

当我使用np.unique时:

np.unique(m_sample, axis=1, return_counts=True)

(array([[1, 1, 2],
        [2, 2, 2],
        [3, 3, 3],
        [1, 5, 4]]),  array([1, 1, 1]))

我并不确定这里返回的矩阵代表什么,更不用说计数数组了。这可能是numpy中的一个bug(或者是开发者没有考虑到的情况)吗?我是否误解了如何在这种情况下使用参数?


如果您指定 axis=0,则会得到以下结果:(array([[1, 2, 1], [1, 4, 5], [2, 2, 2], [3, 3, 3]]), array([1, 1, 1, 1])) 这也是无意义的,并且计数数组的维度也是错误的。 - Daniel Kats
1个回答

0
当您指定一个轴时,np.unique会返回沿着该轴索引的唯一子数组。为了更好地理解,假设其中一行重复:
m_sample = np.array([
    [1, 2, 1],
    [2, 2, 2],
    [3, 3, 3],
    [1, 4, 5],
    [1, 2, 1]
])

在这种情况下,np.unique(m_sample, axis=0, return_counts=True) 的输出为:
(array([[1, 2, 1],
        [1, 4, 5],
        [2, 2, 2],
        [3, 3, 3]]),
 array([2, 1, 1, 1]))

这个元组的第一个元素列出了数组中唯一的行,第二个元素则列出了每行在数组中出现的次数。在这个例子中,行[1, 2, 1]重复了两次。

要获取每行的唯一值,您可以尝试使用以下方法:

import numpy as np

m_sample = np.array([
    [1, 2, 1],
    [2, 2, 2],
    [3, 3, 3],
    [1, 4, 5]
])

s = np.sort(m_sample, axis=1)
mask = np.full(m_sample.shape, True)
mask[:, 1:] = s[:, :-1] != s[:, 1:]
np.split(s[mask], np.cumsum(mask.sum(axis=1)))[:-1]

它给出:

[array([1, 2]), array([2]), array([3]), array([1, 4, 5])]

那么,这个工具不适合我现在要做的事情吗?有没有比np.apply_along_axis和每行应用np.unique更有效的方法? - Daniel Kats
1
只需在行上进行迭代。unique基本上执行排序,并消除相邻的重复项。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接