Python Numpy.独特的行为(一致性变平?)

Python Numpy.独特的行为(一致性变平?),python,numpy,unique,Python,Numpy,Unique,我有两个列表,我需要从中找到与唯一对相关的索引(我能找到的所有SO帖子都只对这些对本身感兴趣)。我一直在尝试使用numpy.unique来实现这一点,但我遇到了一个奇怪的问题。我压缩了列表,创建了一个元组列表,然后set()和np.unique()成功地减少到只有唯一的对,但我想要的是索引到原始列表中。unique的文档表明,如果return\u inverse=True,它将返回这些值。然而,如果设置与否,我会得到不同程度的“扁平化” 在本例中,我使用字符串只是为了避免任何比较问题,实际上它们

我有两个列表,我需要从中找到与唯一对相关的索引(我能找到的所有SO帖子都只对这些对本身感兴趣)。我一直在尝试使用
numpy.unique
来实现这一点,但我遇到了一个奇怪的问题。我压缩了列表,创建了一个元组列表,然后
set()
np.unique()
成功地减少到只有唯一的对,但我想要的是索引到原始列表中。
unique
的文档表明,如果
return\u inverse=True
,它将返回这些值。然而,如果设置与否,我会得到不同程度的“扁平化”

在本例中,我使用字符串只是为了避免任何比较问题,实际上它们是浮动

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')
这是故意的吗?有没有办法使
唯一
在第一种情况下给我想要的索引(类似于
[[6,7],[0,1],[4,5],[2,3]
)?我无法从文档中判断前一种行为还是后一种行为是奇怪的

我需要索引对类似列表中的其他值进行操作。如果我能接触到熊猫,我会使用它,但我必须运行的电脑只有一个非常旧的版本的numpy,没有熊猫。然而,同样的事情在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
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()
但是我希望有更优雅的东西?

版本1.8.1中的for
numpy.unique
从以下内容开始:

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
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\u inverse
return\u index
,则例程将委托Python内置程序查找唯一的元素。它这样做的方式被窃听;它不执行以下保证的展平:

输入数组。如果它还不是一维的,它将被展平

正如Jaime在评论中指出的,这在当前的NumPy master分支中已经得到了修复



我相信你可以把你的两份清单整理成一个表格,从而得到你想要的结果。我不知道
numpy.unique
是否采用结构化数组,但如果不采用,您可以通过使用复制其行为,其中说明了如何将其用于结构化数组。

太棒了!我甚至没有想到结构化数组,但我只是尝试了一下,它正是我想要的。感谢对numpy文档的澄清,我也被
这一矛盾弄糊涂了,如果它还不是一维的话,它将被夷为平地。
错误行为在不久前已经修复,请参阅主源代码,这也是1.9 beta版的源代码。@Jaime:啊,很高兴知道。我没有想到要检查代码的开发版本。@moarningsun-Ahah,我已经找到了那个问题,但在你明确指出之前,我没有在那个答案中看到
idx
。我想我被答案的长度和数量弄糊涂了……对,如果我把具体答案联系起来会更好: