代码之家  ›  专栏  ›  技术社区  ›  Finn Årup Nielsen Mazdak

Numpy中索引的“Kronecker加法”

  •  0
  • Finn Årup Nielsen Mazdak  · 技术社区  · 9 年前

    我正在为Python Numpy寻找一个“Kronecker加法”工具,用于索引元素,而不是像Kronecker产品那样进行乘法。不是标准的克罗内克和,也不是直接和。

    这样做可以:

    def kron_add(A, B):
        C = np.kron(A, np.ones(np.asarray(B).shape)) + \
            np.kron(np.ones(np.asarray(A).shape), B)
        return C
    
    >>> kron_add([0, 40, 80, 120], [0, 1, 2, 3])
    array([   0.,    1.,    2.,    3.,   40.,   41.,   42.,   43.,   80.,
             81.,   82.,   83.,  120.,  121.,  122.,  123.])
    

    对于一维问题,这可以做到:

    >>> [i+j for i in [0, 40, 80, 120] for j in [0, 1, 2, 3]]
    [0, 1, 2, 3, 40, 41, 42, 43, 80, 81, 82, 83, 120, 121, 122, 123]
    

    我想最后一个是相当可读的,它解决了我现在的问题。我只是想知道Numpy是否有一个函数或方法可以直接执行这个相当一般的操作。

    1 回复  |  直到 9 年前
        1
  •  2
  •   hunse    9 年前

    你可以用 Numpy broadcasting :

    a = np.array([0, 40, 80, 120])
    b = np.array([0, 1, 2, 3])
    c = a[:, None] + b[None, :]
    

    声明 a[:, None] 相当于 a.reshape(1, -1) 制作 a 列向量。类似地, b[None, :] 制造 b 行向量。Numpy的广播随后接管,并制作结果矩阵 c 所需金额。如果你希望结果是一个向量(如你的问题)而不是一个矩阵,只需调用 c.ravel() .

    你也可以退房 np.einsum ,一个非常强大的工具,可以让你用爱因斯坦求和表示法来表达这些计算。