【问题标题】:Numpy.unique behavior (flattening insconsistencies?)Numpy.unique 行为(扁平化不一致?)
【发布时间】:2014-09-05 17:35:32
【问题描述】:

我有两个列表,我需要从中找到与唯一对关联的索引(我能找到的所有 SO 帖子都只对这些对本身感兴趣)。我一直在尝试使用numpy.unique 这样做,但我遇到了一个奇怪的问题。我压缩列表以创建一个元组列表,然后 set()np.unique() 成功地减少到唯一的对,但我想要的是原始列表中的索引。 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)

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

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

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

【问题讨论】:

  • @moarningsun Ahah,我发现了这个问题,但直到您明确指出,我才在那个答案中看到idx。我想我被那里答案的长度和数量弄糊涂了......
  • 对,如果我链接到具体答案会更好:stackoverflow.com/a/16973510/2379410

标签: python numpy unique


【解决方案1】:

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 保证的扁平化:

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

正如 Jaime 在 cmets 中指出的,这已在当前的 NumPy 主分支中得到修复。


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

【讨论】:

  • 太棒了!我什至没有想到结构化数组,但我只是试了一下,它正是我想要的。感谢您对 numpy 文档的澄清,我也被 This will be flattened if it is not already 1-D. 的矛盾所迷惑
  • 该错误行为已在不久前得到修复,请参阅主源代码 here,这也是 1.9 测试版中的内容。
  • @Jaime:啊,很高兴知道。我没想到要检查代码的开发版本。
猜你喜欢
  • 1970-01-01
  • 2013-01-17
  • 2019-04-23
  • 2023-04-07
  • 2021-05-24
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多