繁体   English   中英

使用Python查找唯一的数组对

[英]Find unique pairs of array with Python

我正在寻找一种pythonic方法来更快地完成这项操作

import numpy as np
von_knoten = np.array([0, 0, 1, 1, 1, 2, 2, 2, 3, 4])
zu_knoten =  np.array([1, 2, 0, 2, 3, 0, 1, 4, 1, 2])
try:
    for i in range(0,len(von_knoten)-1):
        for j in range(0,len(von_knoten)-1):
            if (i != j) & ([von_knoten[i],zu_knoten[i]] == [zu_knoten[j],von_knoten[j]]):
                    print(str(i)+".column equal " +str(j)+".column")
                    von_knoten = sp.delete(von_knoten , j)
                    zu_knoten = sp.delete(zu_knoten , j)
                    print(von_knoten)
                    print(zu_knoten)
except:
    print('end')

所以我需要最快的方式

[0 0 1 1 4]
[1 2 2 3 2]

[0 0 1 1 1 2 2 2 3 4]
[1 2 0 2 3 0 1 4 1 2]

谢谢 ;)

关于你的代码的一些评论; 按原样,它不会做你想要的,它会打印一些东西,你甚至尝试运行它吗? 你能告诉我们你得到了什么吗?

  • 首先,只需做一个range(len(von_knoten)) ; 这将做你想要的,因为range默认从0开始,并在结束前结束一步。

  • 如果从输入列表中delete某些项目,并尝试访问它们末尾的项目,则可能会在耗尽输入列表分析之前获得IndexError

  • 你做了一些sp.delete但是我们不知道那是什么(代码也没有),这会引发一些AttributeError

  • 唉,请不要使用except: 这将捕获您从未梦想过的异常,并可能解释为什么您不明白什么是错的。


然后,使用zip内置函数获取已排序的二维元组,并删除重复项? 就像是:

>>> von_knoten = [0, 0, 1, 1, 1, 2, 2, 2, 3, 4]
>>> zu_knoten =  [1, 2, 0, 2, 3, 0, 1, 4, 1, 2]
>>> set(tuple(sorted([m, n])) for m, n in zip(von_knoten, zu_knoten))
{(0, 1), (0, 2), (1, 2), (1, 3), (2, 4)}

我让你解决这个问题,以获得你想要的东西。

您正在尝试建立一组您以前从未见过的对。 您可以使用not in但需要以任何方式检查:

L = []
for x,y in zip(von_knoten, zu_knoten):
  if (x, y) not in L and (y, x ) not in L:
    L.append((x, y))

这给出了一个元组列表

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

你可以重塑一下。

这是一个矢量化输出 -

def unique_pairs(von_knoten, zu_knoten):
    s = np.max([von_knoten, zu_knoten])+1
    p1 = zu_knoten*s + von_knoten
    p2 = von_knoten*s + zu_knoten
    p = np.maximum(p1,p2)
    sidx = p.argsort(kind='mergesort')
    ps = p[sidx]
    m = np.concatenate(([True],ps[1:] != ps[:-1]))
    sm = sidx[m]
    return von_knoten[sm],zu_knoten[sm]

样品运行 -

In [417]: von_knoten = np.array([0, 0, 1, 1, 1, 2, 2, 2, 3, 4])
     ...: zu_knoten =  np.array([1, 2, 0, 2, 3, 0, 1, 4, 1, 2])

In [418]: unique_pairs(von_knoten, zu_knoten)
Out[418]: (array([0, 0, 1, 1, 2]), array([1, 2, 2, 3, 4]))

这里使用np.uniquevoid视图方法

def unique_pairs(a, b):
    c = np.sort(np.stack([a, b], axis = 1), axis = 1)
    c_view = np.ascontiguousarray(c).view(np.dtype((np.void,
                                          c.dtype.itemsize * c.shape[1])))
    _, i = np.unique(c_view, return_index = True)
    return a[i], b[i]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM