【问题标题】:How to get "dot addition" in numpy similar to dot product? [duplicate]如何在类似于点积的numpy中获得“点加法”? [复制]
【发布时间】:2020-11-05 05:28:09
【问题描述】:

我对 numpy 有点陌生,并且正在努力解决这个问题。我有两个二维 numpy 数组:

array1 = [a1, a2, ..., an]
array2 = [b1, b2, ..., am]

a1a2b1b2 都是一维数组,其中正好有 100 个浮点数。但是,array1array2 的长度不同。所以array1array2 的形状分别为(n, 100)(m, 100),其中nm 是任意长度。

我想在它们之间执行某种修改后的点积,以便输出以下矩阵:

array([[ a1+b1, a1+b2, a1+b3, ...],
       [ a2+b1, a2+b2, a2+b3, ...],
       [ a3+b1, a3+b2, a3+b3, ...],
       [...]])

我知道np.dot(array1, array2.T) 让我非常接近。它只是在所需的输出数组中给了我a1•b1 而不是a1+b1

对于我来说,使用 numpy 获得所需数组的最高效的计算方式是什么?提前致谢!

【问题讨论】:

    标签: python arrays python-3.x numpy numpy-ufunc


    【解决方案1】:

    为此目的使用np.outer ufunc:

    np.add.outer(array1,array2)
    

    示例:

    array1 = np.array([1,2,3])
    array2 = np.array([1,2])
    

    输出:

    [[2 3]
     [3 4]
     [4 5]]
    

    【讨论】:

    • 谢谢! np.add.outer 正是我所需要的 :)
    【解决方案2】:

    作为一种与上述解决方案略有不同且更通用的解决方案。

    如果你让第一个数组看起来像 (m, 1, 100),第二个数组看起来像 (1, n, 100),然后将这两个相加,你会通过 numpy 的广播得到你想要的规则。

    但这很简单:m[:,None,:] + n[None,:,:]。您可以轻松地将其扩展到mn 之间的任何类型的操作。

    【讨论】:

    • 很好的答案,但我很好奇这在什么意义上会更普遍?
    • 如果数组是 (100, m) 和 (100, n),解决方案仍然是相同的想法。但是,我必须搜索文档以查找是否存在使用第一个索引的某些版本的 np.add,或者 np.add.outer 的某些关键字参数。
    • np.add.ufunc 适用于任意数量的维度,并以与输入相同的顺序返回输出维度。
    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多