纽比。独一无二行为(扁平化不一致性?)

2024-05-15 01:11:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个列表,我需要从中找到与唯一对相关联的索引(我能找到的所有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

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


Tags: 文档numpytrue列表returnnp情况事情
1条回答
网友
1楼 · 发布于 2024-05-15 01:11:03

版本1.8.1中numpy.uniquesource code以以下内容开头:

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不存在,则例程将委托给Python内置程序来查找唯一的元素。它这样做的方式是错误的;它不执行documentation保证的扁平化:

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

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


我相信你可以通过把你的两张单子打包成一个structured array得到你想要的结果。我不知道numpy.unique是否采用结构化数组,但如果不是,则可以通过使用^{}来复制其行为,这说明了如何在结构化数组中使用它。在

相关问题 更多 >

    热门问题