我有两个列表,我需要从中找到与唯一对相关联的索引(我能找到的所有SO帖子都只对这些对本身感兴趣)。我一直在尝试使用numpy.unique
来实现这一点,但遇到了一个奇怪的问题。我压缩列表以创建一个元组列表,然后set()
和{unique
的文档表明如果return_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)
在第一种情况下,这些对作为第二维度保留在输出中。在第二种情况下,甚至元组都被展平,从而破坏了对。在
^{pr2}$这是故意的吗?有没有办法让unique
给我第一种情况下想要的索引(可能是[[6,7], [0,1], [4,5], [2,3]]
)呢?我无法从文档中判断出前一种行为还是后一种行为。在
我需要索引来操作类似列表中的其他值。如果我有机会接触熊猫,我会用它,但我必须运行的电脑只有一个非常旧的版本的纽比,没有熊猫。然而,同样的事情仍然发生在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
但我希望有更优雅的东西?在
版本1.8.1中
numpy.unique
的source code以以下内容开头:如果输入不是数组并且
return_inverse
和return_index
不存在,则例程将委托给Python内置程序来查找唯一的元素。它这样做的方式是错误的;它不执行documentation保证的扁平化:正如Jaime在评论中指出的,这个问题已经在当前的NumPy master分支中得到了修复。在
我相信你可以通过把你的两张单子打包成一个structured array得到你想要的结果。我不知道} 来复制其行为,这说明了如何在结构化数组中使用它。在
numpy.unique
是否采用结构化数组,但如果不是,则可以通过使用^{相关问题 更多 >
编程相关推荐