我有一个2D数组,如何找到该数组中所有重复的索引? 例如,数据看起来像这样
array([[116.366 , 39.8673],[116.17 , 40.2865],...[112.5628, 37.8964]]),
如果第一个和第三个相同,
第二个和第四个相同,则返回值应类似于[[1,3],[2,4]]
。
答案 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.3
和40.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.in1d
与np.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)]