" Kronecker添加"在Numpy索引

时间:2015-03-11 17:32:27

标签: python numpy sum addition

我正在为Python Numpy寻找一个“Kronecker添加”工具,用于索引元素的添加而不是像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 个答案:

答案 0 :(得分:2)

您可以使用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,这是一个非常强大的工具,可让您用爱因斯坦求和表示法表达这些类型的计算。