Numpy 如何查找数组中的任何列是否具有重复值

Numpy 如何查找数组中的任何列是否具有重复值,numpy,Numpy,假设我有一个numpy矩阵a A = array([[ 0.5, 0.5, 3.7], [ 3.8, 2.7, 3.7], [ 3.3, 1.0, 0.2]]) 我想知道是否至少有两行I和I',这样A[I,j]=A[I',j]对于某些列j 在示例A,i=0和i'=1中,对于j=2,答案是yes 我该怎么做 我试过这个: def test(A, n): for j in range(n): i = 0

假设我有一个numpy矩阵
a

A = array([[ 0.5,  0.5,  3.7],
           [ 3.8,  2.7,  3.7],
           [ 3.3,  1.0,  0.2]])
我想知道是否至少有两行
I
I'
,这样
A[I,j]=A[I',j]
对于某些列
j

在示例
A
i=0
i'=1
中,对于
j=2
,答案是
yes

我该怎么做

我试过这个:

def test(A, n):
    for j in range(n):
        i = 0
        while i < n:
            a = A[i, j]
            for s in range(i+1, n):
                if A[s, j] == a:
                    return True
            i += 1
    return False
def测试(A,n): 对于范围(n)内的j: i=0 而i
有没有更快/更好的方法?

检查重复项的方法有很多种。其思想是在Python代码中使用尽可能少的循环来实现这一点。我将在这里介绍几种方法:

  • 使用。您仍然需要在列上循环,因为
    unique
    接受
    axis
    参数是没有意义的,因为每个列可能有不同数量的唯一元素。虽然它仍然需要一个循环,
    unique
    允许您查找重复元素的位置和其他统计信息:

    def test(A):
        for i in range(A.shape[1]):
            if np.unique(A[:, i]).size < A.shape[0]:
                return True
        return False
    
    它的字面意思是“如果按列排序数组中的任何按列差异为零,则返回True”。排序数组中的零差表示存在相同的元素
    axis=0
    使
    sort
    diff
    分别对每列进行操作


  • 您永远不需要传入
    n
    ,因为矩阵的大小是在属性
    shape
    中编码的。如果需要查看矩阵的子集,只需使用索引传入子集即可。它不会复制数据,只返回具有所需尺寸的视图对象。

    检查重复项的方法有很多。其思想是在Python代码中使用尽可能少的循环来实现这一点。我将在这里介绍几种方法:

  • 使用。您仍然需要在列上循环,因为
    unique
    接受
    axis
    参数是没有意义的,因为每个列可能有不同数量的唯一元素。虽然它仍然需要一个循环,
    unique
    允许您查找重复元素的位置和其他统计信息:

    def test(A):
        for i in range(A.shape[1]):
            if np.unique(A[:, i]).size < A.shape[0]:
                return True
        return False
    
    它的字面意思是“如果按列排序数组中的任何按列差异为零,则返回True”。排序数组中的零差表示存在相同的元素
    axis=0
    使
    sort
    diff
    分别对每列进行操作


  • 您永远不需要传入
    n
    ,因为矩阵的大小是在属性
    shape
    中编码的。如果需要查看矩阵的子集,只需使用索引传入子集即可。它不会复制数据,只返回具有所需维度的视图对象。

    没有numpy的解决方案如下:首先,使用
    zip()交换列和行。

    然后检查任何行是否有重复项。您可以通过将列表转换为一个集合来检查重复项,该集合将丢弃重复项并检查长度

    has_duplicates = any(len(set(row)) != len(row) for row in zip(*A))
    

    与纯numpy解决方案相比,最有可能的方式是速度慢,而且内存更密集,但这可能有助于澄清问题。

    没有numpy的解决方案看起来是这样的:首先,使用
    zip()交换列和行。

    然后检查任何行是否有重复项。您可以通过将列表转换为一个集合来检查重复项,该集合将丢弃重复项并检查长度

    has_duplicates = any(len(set(row)) != len(row) for row in zip(*A))
    

    与纯numpy解决方案相比,最有可能的方式是速度较慢,而且内存更密集,但这可能有助于提高清晰度

    您是否希望查看是否有任何列包含重复元素?因为a)这更容易理解,B)是的,您可以使其更快。使用浮点测试
    =
    ,请小心。它不像整数那样可预测。你想看看是否有任何列包含重复的元素吗?因为a)这更容易理解,B)是的,你可以让它更快。使用浮点测试
    ==
    时要小心。它不像整数那样可预测。