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