Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果至少有一个值相等,则合并二维数组的行_Python_Arrays_Numpy - Fatal编程技术网

Python 如果至少有一个值相等,则合并二维数组的行

Python 如果至少有一个值相等,则合并二维数组的行,python,arrays,numpy,Python,Arrays,Numpy,我正在努力实现以下目标。考虑矩阵 [[ 9 10] [10 9] [11 17] [11 18] [12 13] [13 12] [17 11] [17 18] [18 11] [18 17]] 我想“合并”至少有一个相似值的所有行。对于这个例子,我想得到 [[9,10] [11, 17, 18] [12, 13]] 我知道numpy使用固定形状的数组。因此,我尝试用这些值填充另一个NaN数组。一种简单的方法是for循环,我在每一行上循环,检查结果数组是否已经有一个值,如

我正在努力实现以下目标。考虑矩阵

[[ 9 10]
 [10  9]
 [11 17]
 [11 18]
 [12 13]
 [13 12]
 [17 11]
 [17 18]
 [18 11]
 [18 17]]
我想“合并”至少有一个相似值的所有行。对于这个例子,我想得到

[[9,10]
[11, 17, 18]
[12, 13]]
我知道numpy使用固定形状的数组。因此,我尝试用这些值填充另一个NaN数组。一种简单的方法是for循环,我在每一行上循环,检查结果数组是否已经有一个值,如果已经有,则扩展,如果没有放入下一个空闲行。 我在没有numpy的情况下完成了这项工作,使用列表列表将组放入其中

groups = []
for pair in matrix:
    pair = [pair[0], pair[1]]
    append_pair = True                
    for sublist in groups:
        if pair[0] in sublist or pair[1] in sublist:
            sublist.extend(x for x in pair if x not in sublist)
            append_pair = False
    if append_pair is True:
        groups.append(pair)

有更好的numpy方法吗?

这里有一个优化的方法,但有点不成熟:

In [14]: def find_intersection(m_list):
            for i,v in enumerate(m_list) : 
                for j,k in enumerate(m_list[i+1:],i+1):
                       if np.in1d(v, k).any():
                              m_list[i] = np.union1d(v, m_list.pop(j))
                              return find_intersection(m_list)
            return m_list
   ....:         

In [15]: find_intersection(a)
Out[15]: [array([ 9, 10]), array([11, 17, 18]), array([12, 13])]

如果将每个子列表视为连接两个节点的边,则这是一个连接组件查找问题。如果安装了
networkx
,也可以使用
networkx
软件包的功能来解决此问题

import networkx as nx

G = nx.from_edgelist([[ 9, 10],
                     [10,  9],
                     [11, 17],
                     [11, 18],
                     [12, 13],
                     [13, 12],
                     [17, 11],
                     [17, 18],
                     [18, 11],
                     [18, 17]])
list(nx.connected_components(G))
[{9, 10}, {11, 17, 18}, {12, 13}]

这是一个
numpy
问题。所以将使用
Scipy
解决方案。但是它的用法没有很好的文档记录。我建议您在此处使用
networkx

您的解决方案运行良好。由于可读性,我更喜欢Tai的答案,但由于我要求提供numpy解决方案,我将接受您的答案。感谢您引入networkx!由于可读性更好,我更喜欢您的代码,但由于我要求一个numpy解决方案,我会接受他的。