从标签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)