我该如何解释 np.einsum("ijij->ij"
how do I interpret np.einsum("ijij->ij"
我正在尝试理解 np.einsum,但似乎没有与我的特定上下文相关的示例。 numpy docs, a guide here, here, and a Whosebug answer here中有很多很好的例子。
但是
没有与我的问题相似的例子np.einsum("ijij->ij", padded_matrix)
当我输出 padded_matrix 时,我得到
>> padded_matrix
>> [[[[[1. 0. 0. 0.33333333 0. 0.33333333]]
[[0. 1. 0. 0. 0. 0. ]]
[[0. 0. 1. 0. 0. 0. ]]
[[0.33333333 0. 0. 1. 0. 0.33333333]]
[[0. 0. 0. 0. 1. 0. ]]
[[0.33333333 0. 0. 0.33333333 0. 1. ]]]]]
padded_matrix为1的长度,为<class 'numpy.ndarray'>
。不幸的是,复制填充矩阵的输出不起作用。在实际程序中,padded_matrix 是对函数的调用,太复杂而无法包含在这里,因此,为什么我复制了它的输出。
结果是 [[1. 1. 1. 1. 1. 1.]]
但我无法弄清楚元素是如何相乘的,然后在哪个轴上求和。
鉴于我没有提供有效的 MWE,如果有人能告诉我 "ijij->ij" 在给定的 padded_matrix
作为 <class 'numpy.ndarray'>
的上下文中应该做什么,我会不胜感激
我最好的猜测是
np.einsum("ii->i,A")
查看矩阵 A 的对角线,这是否意味着在这种用法中,由于所有填充,i
被有效地替换为 ij
,因此 np.einsum("ijij->ij",padded_matrix)
是diaganol的观点吗?
没有乘法,因为只有一个参数:
In [25]: arr = np.arange(36).reshape(1,6,1,6)
In [26]: arr
Out[26]:
array([[[[ 0, 1, 2, 3, 4, 5]],
[[ 6, 7, 8, 9, 10, 11]],
[[12, 13, 14, 15, 16, 17]],
[[18, 19, 20, 21, 22, 23]],
[[24, 25, 26, 27, 28, 29]],
[[30, 31, 32, 33, 34, 35]]]])
In [27]: np.einsum('ijij->ij', arr)
Out[27]: array([[ 0, 7, 14, 21, 28, 35]])
这个einsum
实际上是一个diagonal
。
In [29]: np.einsum('ii->i', arr.squeeze())
Out[29]: array([ 0, 7, 14, 21, 28, 35])
In [30]: np.diagonal(arr.squeeze())
Out[30]: array([ 0, 7, 14, 21, 28, 35])
我正在尝试理解 np.einsum,但似乎没有与我的特定上下文相关的示例。 numpy docs, a guide here, here, and a Whosebug answer here中有很多很好的例子。
但是
没有与我的问题相似的例子np.einsum("ijij->ij", padded_matrix)
当我输出 padded_matrix 时,我得到
>> padded_matrix
>> [[[[[1. 0. 0. 0.33333333 0. 0.33333333]]
[[0. 1. 0. 0. 0. 0. ]]
[[0. 0. 1. 0. 0. 0. ]]
[[0.33333333 0. 0. 1. 0. 0.33333333]]
[[0. 0. 0. 0. 1. 0. ]]
[[0.33333333 0. 0. 0.33333333 0. 1. ]]]]]
padded_matrix为1的长度,为<class 'numpy.ndarray'>
。不幸的是,复制填充矩阵的输出不起作用。在实际程序中,padded_matrix 是对函数的调用,太复杂而无法包含在这里,因此,为什么我复制了它的输出。
结果是 [[1. 1. 1. 1. 1. 1.]]
但我无法弄清楚元素是如何相乘的,然后在哪个轴上求和。
鉴于我没有提供有效的 MWE,如果有人能告诉我 "ijij->ij" 在给定的 padded_matrix
作为 <class 'numpy.ndarray'>
的上下文中应该做什么,我会不胜感激
我最好的猜测是
np.einsum("ii->i,A")
查看矩阵 A 的对角线,这是否意味着在这种用法中,由于所有填充,i
被有效地替换为 ij
,因此 np.einsum("ijij->ij",padded_matrix)
是diaganol的观点吗?
没有乘法,因为只有一个参数:
In [25]: arr = np.arange(36).reshape(1,6,1,6)
In [26]: arr
Out[26]:
array([[[[ 0, 1, 2, 3, 4, 5]],
[[ 6, 7, 8, 9, 10, 11]],
[[12, 13, 14, 15, 16, 17]],
[[18, 19, 20, 21, 22, 23]],
[[24, 25, 26, 27, 28, 29]],
[[30, 31, 32, 33, 34, 35]]]])
In [27]: np.einsum('ijij->ij', arr)
Out[27]: array([[ 0, 7, 14, 21, 28, 35]])
这个einsum
实际上是一个diagonal
。
In [29]: np.einsum('ii->i', arr.squeeze())
Out[29]: array([ 0, 7, 14, 21, 28, 35])
In [30]: np.diagonal(arr.squeeze())
Out[30]: array([ 0, 7, 14, 21, 28, 35])