Kub*_*uba 5 python numpy matrix tensorflow
在numpy和tensorflow中,如果较小矩阵的形状是较大矩阵的后缀,则可以添加不同维度的矩阵(或张量).这是一个例子:
x = np.ndarray(shape=(10, 7, 5), dtype = float)
y = np.ndarray(shape=(7, 5), dtype = float)
Run Code Online (Sandbox Code Playgroud)
对于这两个矩阵,操作x+y是一个快捷方式:
for a in range(10):
for b in range(7):
for b in range(5):
result[a,b,c] = x[a,b,c] + y[b,c]
Run Code Online (Sandbox Code Playgroud)
在我的情况,但是我有形状的矩阵(10,7,5)和(10,5)与同样予想执行+使用类似的逻辑运算:
for a in range(10):
for b in range(7):
for b in range(5):
result[a,b,c] = x[a,b,c] + y[a,c]
^
Run Code Online (Sandbox Code Playgroud)
在这种情况下,x+y操作失败,因为numpy和tensorflow都不了解我想要做的事情.有没有什么方法可以有效地执行此操作(不自己编写python循环)?
到目前为止,我已经想过我可以使用einsum 引入一个临时z的形状矩阵,(10,7,5)如下所示:
z = np.einsum('ij,k->ikj', y, np.ones(7))
x + z
Run Code Online (Sandbox Code Playgroud)
但这会创建一个明确的三维矩阵(或张量),如果可能的话我宁愿避免这种情况.
在 NumPy 中,您可以扩展y到3D然后添加 -
x + y[:,None,:]
Run Code Online (Sandbox Code Playgroud)
还没有tensorflow真正处理过,但查看它的文档,似乎我们可以使用tf.expand_dims-
x + tf.expand_dims(y, 1)
Run Code Online (Sandbox Code Playgroud)
扩展版本仍然是一个视图y,因此不会占用更多内存,如下测试 -
In [512]: np.may_share_memory(y, y[:,None,:])
Out[512]: True
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1160 次 |
| 最近记录: |