Python 如何获取二维阵列的唯一行及其引用?
我有一个2D数组,它有一些重复的列。我希望能够看到有哪些独特的列,以及重复的列在哪里 我自己的数组太大,无法放在这里,但下面是一个示例: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
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]}
,也就是说,有一个数组中每个唯一列出现的位置列表。