如何找到二维数组中的重复索引?

时间:2018-12-15 15:20:11

标签: python numpy

我有一个2D数组,如何找到该数组中所有重复的索引? 例如,数据看起来像这样

array([[116.366 ,  39.8673],[116.17  ,  40.2865],...[112.5628,  37.8964]]), 

如果第一个和第三个相同, 第二个和第四个相同,则返回值应类似于[[1,3],[2,4]]

2 个答案:

答案 0 :(得分:0)

让我们从对您的任务进行一些更正开始:由于源数组是 二维,每个元素都有两个索引,因此,如果出现一个元素 多次,此元素的结果应为的列表 (行/列)-哪些元素具有此值。

就代码而言,让我们从导入和创建开始 源数组:

import numpy as np
import pandas as pd

tbl = np.array([[116.3, 39.8], [116.1, 40.2],  [40.2, 116.3], [112.5, 37.8]])

如您所见,我们有4行2列,其中116.340.2出现两次。

然后,我们必须为DataFrame生成数据(每个元素的值和索引)。 为此,我们可以使用np.nditer函数:

tbl2 = []
it = np.nditer(tbl, flags=['multi_index'])
while not it.finished:
    tbl2.append([float(it[0]), it.multi_index])
    it.iternext()

需要显式强制转换(根据您的数据,强制转换为float), 因为否则迭代器将返回0维NumPy数组, 不可散列,后来导致问题的原因。

然后,我们创建一个具有正确列名的DataFrame(元素及其 索引):

df = pd.DataFrame(data=tbl2, columns=['elem', 'indices'])

最后一点是创建结果:

df[df.duplicated(subset=['elem'], keep=False)]\
    .groupby('elem')['indices'].apply(list)

(上述数据的)输出为:

elem
40.2     [(1, 1), (2, 0)]
116.3    [(0, 0), (2, 1)]
Name: indices, dtype: object

结果实际上是一个熊猫系列,其键名为elem(元素值) 并且值是一个元组列表-特定元素在索引中的索引 源数组。

如果您对非唯一元素的索引感兴趣, 将上述结果保存在例如result变量并添加:

[y for x in result for y in x]

然后输出将是:

[(1, 1), (2, 0), (0, 0), (2, 1)]

答案 1 :(得分:0)

这是一种方法。说你有:

l_ = np.array([[1,4,3],[1,4,3],[2,4,6],[2,3],[2,3],[2,3]])

您可以将所有内部列表转换为字符串:

l = list(map(str,l_))

允许将np.in1dnp.flatnonzero结合使用来搜索重复列表的索引:

dup = {tuple(np.flatnonzero(np.in1d(l,i))) for i in l}

请注意,对列表中的每个“字符串”重复np.in1d(l,i)),因此相同的结果将重复进行多次。在set中创建tuples,可以避免重复。

最后,要过滤出不重复的列表(单个项目元组),您可以执行以下操作:

list(filter(lambda x: len(x) > 1, dup))

[(0, 1), (3, 4, 5)]