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

从标签python列表创建关联矩阵的快速方法?

从标签python列表创建关联矩阵的快速方法?,python,algorithm,numpy,cluster-analysis,vectorization,Python,Algorithm,Numpy,Cluster Analysis,Vectorization,我有一个数组y,len(y)=M,它包含0->N中的值。例如,使用N=3: y = [0, 2, 0, 1, 2, 1, 0, 2] 关联矩阵A定义如下: 尺寸MxM A(i,j)=1如果y(i)==y(j) A(i,j)=0如果y(i)!=y(j) 一个简单的算法是: def incidence(y): M = len(y) A = np.zeros((M,M)) for i in range(M): for j in range(M):

我有一个数组
y,len(y)=M
,它包含
0->N
中的值。例如,使用
N=3

y = [0, 2, 0, 1, 2, 1, 0, 2]
关联矩阵
A
定义如下:

  • 尺寸
    MxM
  • A(i,j)=1如果y(i)==y(j)
  • A(i,j)=0如果y(i)!=y(j)
一个简单的算法是:

def incidence(y):
    M = len(y)
    A = np.zeros((M,M))
    for i in range(M):
        for j in range(M):
            if y[i]==y[j]:
                A[i,j] = 1
    return A

但这是非常缓慢的。有什么方法可以更快地做到这一点吗?例如,使用列表理解或向量化。

您可以利用numpy广播,通过简单询问
y
是否等于其转置,在这里比python获得一些效率:

import numpy as np

y = np.array([1, 2, 1, 0, 0, 1, 2])

def mat_me(y):
    return (y == y.reshape(-1, 1)).astype(int)

mat_me(y)
产生:

array([[1, 0, 1, 0, 0, 1, 0],
       [0, 1, 0, 0, 0, 0, 1],
       [1, 0, 1, 0, 0, 1, 0],
       [0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 1, 1, 0, 0],
       [1, 0, 1, 0, 0, 1, 0],
       [0, 1, 0, 0, 0, 0, 1]])
作为比较:

y = np.random.choice([1, 2, 3], size=3000)

def mat_me_py(y):
    return (y == y.reshape([-1, 1])).astype(int)

%timeit mat_me_py(y)  
# 28.6 ms ± 1.11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
vs

在更大的名单上,差异将变得非常明显

y = np.random.choice([1, 2, 3], size=3000)
y = list(y)

def mat_me_py(y):
    return [[int(a == b) for a in y] for b in y]

%timeit mat_me_py(y)
# 4.16 s ± 213 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)