Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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_Unique - Fatal编程技术网

Python 如何获取二维阵列的唯一行及其引用?

Python 如何获取二维阵列的唯一行及其引用?,python,arrays,numpy,unique,Python,Arrays,Numpy,Unique,我有一个2D数组,它有一些重复的列。我希望能够看到有哪些独特的列,以及重复的列在哪里 我自己的数组太大,无法放在这里,但下面是一个示例: a = np.array([[ 1., 0., 0., 0., 0.],[ 2., 0., 4., 3., 0.],]) 这有唯一的列向量[1,2.],[0,0.],[0,4.]和[0,3.]。有一个副本:[0,0.]出现两次 现在我找到了一种获得唯一向量及其索引的方法,但我不清楚如何获得重复的出现。我尝试过几种简单的方法(使用np.wher

我有一个2D数组,它有一些重复的列。我希望能够看到有哪些独特的列,以及重复的列在哪里

我自己的数组太大,无法放在这里,但下面是一个示例:

a = np.array([[ 1.,  0.,  0.,  0.,  0.],[ 2.,  0.,  4.,  3.,  0.],])
这有唯一的列向量
[1,2.]
[0,0.]
[0,4.]
[0,3.]
。有一个副本:
[0,0.]
出现两次

现在我找到了一种获得唯一向量及其索引的方法,但我不清楚如何获得重复的出现。我尝试过几种简单的方法(使用
np.where
和list comp),但这些方法都非常慢。肯定会有一种音乐的方式吗

在matlab中,它只是
unique
函数,但
np。unique
使阵列平坦。

对于小型阵列:

    from collections import defaultdict
    indices = defaultdict(list)
    for index, column in enumerate(a.transpose()):
        indices[tuple(column)].append(index)
    unique = [kk for kk, vv in indices.items() if len(vv) == 1]
    non_unique = {kk:vv for kk, vv in indices.items() if len(vv) != 1}

这里有一种矢量化的方法,可以为我们提供一个数组列表作为输出-

ids = np.ravel_multi_index(a.astype(int),a.max(1).astype(int)+1)
sidx = ids.argsort()
sorted_ids = ids[sidx]
out = np.split(sidx,np.nonzero(sorted_ids[1:] > sorted_ids[:-1])[0]+1)
样本运行-

In [62]: a
Out[62]: 
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 2.,  0.,  4.,  3.,  0.]])

In [63]: out
Out[63]: [array([1, 4]), array([3]), array([2]), array([0])]
该软件包(免责声明:我是其作者)包含用于计算此类内容的高效功能:

import numpy_indexed as npi
unique_columns = npi.unique(a, axis=1)
non_unique_column_idx = npi.multiplicity(a, axis=1) > 1
或者:

unique_columns, column_count = npi.count(a, axis=1)
duplicate_columns = unique_columns[:, column_count > 1]

@WarrenWeckesser I将其链接,因为它解决了查找唯一行的问题,但没有解决查找重复项在阵列中的位置的问题。您打算用重复ID标记重复列吗?或者你想得到重复列的计数吗?我想说一些类似于
{col1:[0],col2:[1,4],col3:[2],col4:[3]}
,也就是说,有一个数组中每个唯一列出现的位置列表。