如何比较指数列表

时间:2016-12-28 05:52:58

标签: python arrays numpy compare

我有一个1x1000的超级数组。

su = np.ones(1000)

3个列表,(1,1000)之间的指数。

l1=random.sample(range(1, 1000), 320)
l2=random.sample(range(1, 1000), 340)
l3=random.sample(range(1, 1000), 412)

基本上这些列表代表w.r.t超级数组的索引,它们的值为1。

如何比较这三个列表,甚至不对它们进行膨胀或在超级数组上进行插值。

一个小例子--->

考虑这两个数组a1=[0,1,1,0,0];a2= [1,1,0,0,0]它们都可以表示为a1_=[1,2]; a2_=[0,1],其索引值为1。现在很容易比较a1,a1的表示为

In [593]:cosine_distances(a1,a2)
Out[594]: array([[ 0.5]])

但如果以a1_, a2_的形式给出,你会如何比较?这就是我正在问的问题

3 个答案:

答案 0 :(得分:0)

我认为你正在寻找l1,l2,l3中的共同元素?您可以使用集合:

s1 = set(l1)
s2 = set(l2)
s3 = set(l3)

然后分别使用s1.intersection(s2)s1.difference(s2)找到共同/不同的索引。一个简单的长度检查:

assert len(s1) == len(s1.intersection(s2)) + len(s1.difference(s2))

没有输出,因此长度按预期正确加起来。

答案 1 :(得分:0)

应该可以很容易地比较这两个向量之间的余弦相似性。对于余弦相似性,您需要每个向量的模数以及两个向量的点积。

由于向量只包含1和0,因此模数很容易,向量中的1的数量为平方根。

l1_mod = math.sqrt(len(l1))
l2_mod = math.sqrt(len(l2))

现在点积很棘手,你需要找出两个向量之间的共同元素的数量。您应该使用np.intersect1d,因为您正在处理一维数组。

dot = len(np.intersect1d(l1, l2))
simililarity = dot / (l1_mod*l2_mod)

毋庸置疑,将其包装成单一功能!

答案 2 :(得分:0)

密集阵列解决方案

a_表单转换为a表单很容易,其功能如下:

def foo(a_, n):
    a = np.zeros(n,int)
    a[a_] = 1
    return a

In [1565]: foo([1,2],5)
Out[1565]: array([0, 1, 1, 0, 0])
In [1566]: foo([0,1],5)
Out[1566]: array([1, 1, 0, 0, 0])

使用简单列表,该函数会提供所需的值,但会显示警告。

In [1572]: a1=[0,1,1,0,0];a2= [1,1,0,0,0]
In [1573]: pairwise.cosine_distances(a1,a2)
/usr/lib/python3/dist-packages/sklearn/utils/validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.
Out[1573]: array([[ 0.5]])

所以我需要修改我的foo,这样它也会创建(1,5)数组:

def foo(a_, n):
   a = np.zeros((1,n),int)
   a[:,a_] = 1
   return a

In [1575]: pairwise.cosine_distances(foo([1,2],5),foo([0,1],5))
Out[1575]: array([[ 0.5]])

稀疏矩阵解

cosine_distance接受稀疏矩阵输入。

制作稀疏矩阵的最简单方法是使用密集数组,甚至使用a1列表

In [1580]: from scipy import sparse
In [1592]: sparse.csr_matrix(a1)
Out[1592]: 
<1x5 sparse matrix of type '<class 'numpy.int32'>'
    with 2 stored elements in Compressed Sparse Row format>

In [1593]: sparse.csr_matrix(a1).A    # view it as a dense array
Out[1593]: array([[0, 1, 1, 0, 0]], dtype=int32)

In [1594]: pairwise.cosine_distances( sparse.csr_matrix(a1), sparse.csr_matrix(a2))
Out[1594]: array([[ 0.5]])

作为中间步骤,我可以做到:

In [1581]: sparse.csr_matrix(foo([1,2],5))
Out[1581]: 
<1x5 sparse matrix of type '<class 'numpy.int32'>'
    with 2 stored elements in Compressed Sparse Row format>

下一步是直接从a_格式制作稀疏矩阵。这需要更多关于稀疏矩阵的知识。

使用稀疏coo输入样式:

In [1601]: sparse.csr_matrix(([1,1],([0,0],[1,2])), shape=(1,5)).A
Out[1601]: array([[0, 1, 1, 0, 0]], dtype=int32)

def mkcsr(a_, n):
    col = np.array(a_)
    row = np.zeros_like(col)
    data = np.ones_like(col)
    return sparse.csr_matrix((data, (row, col)), shape=(1,n))

In [1611]: mkcsr([1,2],5).A
Out[1611]: array([[0, 1, 1, 0, 0]], dtype=int32)

In [1614]: pairwise.cosine_distances(mkcsr([1,2],5), mkcsr([0,1],5))
Out[1614]: array([[ 0.5]])