python - Numpy.unique 行为(扁平化不一致?)

标签 python numpy unique

我有两个列表,我需要从中找到与唯一对相关的索引(我能找到的所有SO帖子只对这些对本身感兴趣)。我一直在尝试使用 numpy.unique 来执行此操作,但遇到了奇怪的情况。我压缩列表以创建元组列表,然后 set()np.unique() 成功削减为仅唯一对,但我想要的是原始列表中的索引。 unique 的文档表明,如果 return_inverse=True 它将返回这些值。但是,无论是否设置,我都会得到不同级别的“扁平化”。

在此示例中,我使用字符串只是为了避免任何比较问题,实际上它们是 float 。

import numpy as np

l_1 = ['12.34', '12.34', '12.34', '12.34', '56.78', '56.78', '90.12', '90.12']
l_2 = ['-1.23', '-1.23', '-4.56', '-4.56', '-6.78', '-6.78', '-9.01', '-9.01']
ll = zip(l_1, l_2)

ull1 = np.unique(ll)

ull2, inds = np.unique(ll, return_inverse=True)

在第一种情况下,这些对在输出中保留为第二维。在第二种情况下,甚至元组也被展平,从而破坏了对。

In [1]: ull1
Out[1]: 
array([['-9.01', '90.12'],
       ['-1.23', '12.34'],
       ['-6.78', '56.78'],
       ['-4.56', '12.34']], 
      dtype='|S5')

In [2]: ull2
Out[2]:
array(['-1.23', '-4.56', '-6.78', '-9.01', '12.34', '56.78', '90.12'], 
      dtype='|S5')

这是故意的吗?有没有办法让 unique 为我提供第一种情况下我想要的索引(类似于 [[6,7], [0,1], [4, 5]、[2,3]])?我无法从文档中判断前一种行为还是后一种行为是否奇怪。

我需要索引来对类似列表中的其他值进行操作。如果我能够访问 pandas,我会使用它,但是我必须运行的计算机只有非常旧版本的 numpy,没有 pandas。然而,同样的事情在 numpy 1.8.1 中仍然发生。我知道我可以做如下的事情:

sll = list(set(ll))
for i in range(len(sll)):
    inds = np.where([val == sll[i] for val in ll])
    # I do my operations here using inds

但我希望有更优雅的东西?

最佳答案

source code对于 numpy.unique在版本 1.8.1 中以以下内容开头:

try:
    ar = ar.flatten()
except AttributeError:
    if not return_inverse and not return_index:
        return np.sort(list(set(ar)))
    else:
        ar = np.asanyarray(ar).flatten()

如果输入不是数组且 return_inversereturn_index如果不存在,则例程委托(delegate) Python 内置函数来查找唯一元素。它这样做的方式被窃听了;它不执行 documentation 的扁平化保证:

Input array. This will be flattened if it is not already 1-D.

正如 Jaime 在评论中指出的那样,这个问题已在当前的 NumPy 主分支中得到修复。


我相信你可以通过将两个列表打包到 structured array 中来获得你想要的结果。 。不知道是不是numpy.unique接受结构化数组,但如果没有,您可以使用 numpy.sort 复制其行为,其中记录了如何将其与结构化数组一起使用。

关于python - Numpy.unique 行为(扁平化不一致?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25691164/

相关文章:

Pandas 分组和排名 - 重复的排名相同

python - Matplotlib如何在PIL图像上画图

python - 如何判断数据框是否为混合类型?

python - 如何从多索引数据框中删除索引列

python - 如何在 python 中分组和计算二项式变量?并绘制这个图

在 Matlab 中可读的 Python 输出

mysql - 当我尝试在 Rails 项目中创建唯一索引时出现空迁移

sql - 将重复的 varchars 更新为在 SQL 数据库中是唯一的

python - 无法从 'train_unsupervised'(未知位置)导入名称 'fastText'

python - 返回线性矩阵方程的最小二乘解的函数