gpt4 book ai didi

python - 如何有效地扩展 numpy 中的分解张量?

转载 作者:行者123 更新时间:2023-11-30 23:21:52 27 4
gpt4 key购买 nike

我有一个 3D 张量,分解为三个 2D 矩阵,如本文中的方程 22:http://www.iro.umontreal.ca/~memisevr/pubs/pami_relational.pdf

我的问题是,如果我想显式计算张量,numpy 中是否有比这更好的方法?

W = np.zeros((100,100,100))
for i in range(100):
for j in range(100):
for k in range(100):
W[i,j,k] = np.sum([wxf[i,f]*wyf[j,f]*wzf[k,f] for f in range(100)])

最佳答案

我倾向于使用einsum对于这些东西,只是因为它通常是最容易编写的:

def fast(wxf, wyf, wzf):
return np.einsum('if,jf,kf->ijk', wxf, wyf, wzf)

def slow(wxf, wyf, wzf):
N = len(wxf)
W = np.zeros((N, N, N))
for i in range(N):
for j in range(N):
for k in range(N):
W[i,j,k] = np.sum([wxf[i,f]*wyf[j,f]*wzf[k,f] for f in range(N)])
return W

def gen_ws(N):
wxf = np.random.random((N,N))
wyf = np.random.random((N,N))
wzf = np.random.random((N,N))
return wxf, wyf, wzf

给出

>>> ws = gen_ws(25)
>>> via_slow = slow(*ws)
>>> via_fast = fast(*ws)
>>> np.allclose(via_slow, via_fast)
True

>>> ws = gen_ws(100)
>>> %timeit fast(*ws)
10 loops, best of 3: 91.6 ms per loop

关于python - 如何有效地扩展 numpy 中的分解张量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24767610/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com