【问题标题】:Dot product of every element with every other element of an array每个元素与数组的每个其他元素的点积
【发布时间】:2011-01-17 20:03:55
【问题描述】:

有没有一种简单的方法可以将数组中一个元素的点积彼此相乘? 所以给定:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

我想得到结果:

array([  32.,   50.,  122.])

即a[0] 点 a[1], a[0] 点 a[2], a[1] 点 a[2].

我正在使用的数组不是正方形的;这只是一个例子。

谢谢!

【问题讨论】:

    标签: python numpy dot-product


    【解决方案1】:
    >>> X = scipy.matrix('1 2 3; 4 5 6; 7 8 9')
    >>> X*X.T
    matrix([[ 14,  32,  50],
            [ 32,  77, 122],
            [ 50, 122, 194]])
    

    它为您提供了比您想要的更多的东西,但不可否认它很容易。

    或者

    >>> X = scipy.array([[1,2,3], [4,5,6], [7,8,9]])
    >>> scipy.dot(X, X.T)
    array([[ 14,  32,  50],
           [ 32,  77, 122],
           [ 50, 122, 194]])
    

    【讨论】:

    • 如果您只想提取感兴趣的元素:np.dot(X, X.T)[np.triu_indices_from(X, k=1)]
    • 谢谢乔,虽然我使用的数组不是正方形的。
    • 注意:triu_indices_from 是 Numpy v.1.4.0 中的新功能。 Christoph:你可以改用triu_indices(len(X),k=1),因为X*X.T 总是方形的。
    【解决方案2】:

    因为看起来你正在使用 numpy:

    from itertools import combinations
    import numpy as np
    
    dot_products = [np.dot(*v) for v in combinations(vectors, 2)]
    

    我检查了这个,它似乎可以在我的 python 安装上工作。

    【讨论】:

    • 你知道这与纯 Numpy 实现相比有多快吗?我将使用的数组将包含大约 5000-10000 个元素,所以我需要它快。
    • 5k-10k 元素对于现代计算机来说实际上算不了什么。
    • @Seth Johnson:在这种情况下,甚至 5k-10k 个元素也很重要。为所有组合单独调用 np.dot 的开销太大。 np.dot 可以更有效地用于计算所有向量组合之间的内积。谢谢
    【解决方案3】:

    这是另一个:

    >>> a = numpy.array([[1, 2, 3],
    ...        [4, 5, 6],
    ...        [7, 8, 9]])
    >>> numpy.array([numpy.dot(a[i], a[j]) for i in range(len(a)) for j in range(i + 1, len(a))])
    array([ 32,  50, 122])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多