您希望以下列方式将张量乘以矩阵:
尺寸
宽: a x b x c
五: a x c
我想这样的Z.
Z[i]=dot(W[i],V[i])
Run Code Online (Sandbox Code Playgroud)
Z是那么尺寸a x ( (b x c) . (c x 1)),所以(a x b)
香港专业教育学院曾试图numpy.tensordot做到这一点,但还没有能够.它可以做我想要的吗?如果不是,我怎么能这样做没有循环.
基本上相当于
def f(W,V):
Z=[]
for i in range(len(W)):
Z.append(dot(W[i],V[i]))
return Z
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑:具体是这可以通过tensordot实现吗?
np.einsum("abc,ac -> ab", w, v):import numpy as np
def z_loop(w,v): # define it to check that `einsum()` gives necessary result
z = np.empty(w.shape[:-1], dtype=w.dtype)
for i in range(z.shape[0]):
z[i,:] = np.dot(w[i,:], v[i,:])
return z
w = np.random.uniform(size=(3,4,5))
v = np.random.uniform(size=w.shape[::2])
assert np.allclose(z_loop(w, v), np.einsum('abc,ac -> ab', w, v))
Run Code Online (Sandbox Code Playgroud)
可能有更简单的变体(via dot(),.reshape())但einsum()对于任务描述来说是最明显的.
def z_dot(w, v):
z = np.dot(w, v[:,...,np.newaxis])
z = z.reshape(z.shape[:-1])
return np.diagonal(z, axis2=-1).T
assert np.allclose(z_dot(w, v), np.einsum('abc,ac -> ab', w, v))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2202 次 |
| 最近记录: |