我正在尝试理解python代码,该代码numpy.einsum()
用于将4维numpy数组转换为2维A
或3维数组。传递给的下标numpy.einsum()
如下:
Mat1 = np.einsum('aabb->ab', A)
Mat2 = np.einsum('abab->ab', A)
Mat3 = np.einsum('abba->ab', A)
T1 = np.einsum('abcb->abc' A)
T2 = np.einsum('abbc->abc', A)
例如,在遵循了(理解NumPy的einsum)和(Python-Sum 4D数组)的回答之后,我试图numpy.sum()
用来理解上述下标的含义,Mat1 = np.sum(A, axis=(0,3))
但是我无法复制得到的结果numpy.einsum()
。有人可以解释这些下标的解释方式numpy.einsum()
吗?
我建议您阅读Wikipedia上的Einstein符号。
这是您问题的简短答案:
np.einsum('aabb->ab', A)
手段:
res = np.empty((max_a, max_b), dtype=A.dtype)
for a in range(max_a):
for b in range(max_b):
res[a, b] = A[a, a, b, b]
return res
简短说明:
aabb
表示索引及其相等性(请参阅A[a, a, b, b]
);
->ab
表示形状是(max_a, max_b)
并且您不需要在这两个索引上有两个具有和。(如果他们c
也是,那么您应该将所有内容加起来,c
因为后面没有显示->
)
您的其他示例:
np.einsum('abab->ab', A)
# Same as (by logic, not by actual code)
res = np.empty((max_a, max_b), dtype=A.dtype)
for a in range(max_a):
for b in range(max_b):
res[a, b] = A[a, b, a, b]
return res
np.einsum('abba->ab', A)
# Same as (by logic, not by actual code)
res = np.empty((max_a, max_b), dtype=A.dtype)
for a in range(max_a):
for b in range(max_b):
res[a, b] = A[a, b, b, a]
return res
np.einsum('abcb->abc', A)
# Same as (by logic, not by actual code)
res = np.empty((max_a, max_b, max_c), dtype=A.dtype)
for a in range(max_a):
for b in range(max_b):
for c in range(max_c):
res[a, b, c] = A[a, b, c, b]
return res
np.einsum('abbc->abc', A)
# Same as (by logic, not by actual code)
res = np.empty((max_a, max_b, max_c), dtype=A.dtype)
for a in range(max_a):
for b in range(max_b):
for c in range(max_c):
res[a, b, c] = A[a, b, b, c]
return res
一些代码来检查它是否真实:
import numpy as np
max_a = 2
max_b = 3
max_c = 5
shape_1 = (max_a, max_b, max_c, max_b)
A = np.arange(1, np.prod(shape_1) + 1).reshape(shape_1)
print(A)
print()
print(np.einsum('abcb->abc', A))
print()
res = np.empty((max_a, max_b, max_c), dtype=A.dtype)
for a in range(max_a):
for b in range(max_b):
for c in range(max_c):
res[a, b, c] = A[a, b, c, b]
print(res)
print()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句