"Kronecker addition" 用于在 Numpy 中建立索引
"Kronecker addition" for indexing in Numpy
我正在为 Python Numpy 寻找一个 "Kronecker addition" 工具,用于在其中添加元素而不是像 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 是否有一个函数或方法可以直接执行这个相当一般的操作。
您可以使用 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
,这是一个非常强大的工具,可以让您用爱因斯坦求和符号表达这些类型的计算。
我正在为 Python Numpy 寻找一个 "Kronecker addition" 工具,用于在其中添加元素而不是像 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 是否有一个函数或方法可以直接执行这个相当一般的操作。
您可以使用 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
,这是一个非常强大的工具,可以让您用爱因斯坦求和符号表达这些类型的计算。