python - numpy.einsum 的输出形状
问题描述
有没有一种优雅的方法可以根据np.einsum
给定的 einsum 的输入参数预先计算结果的形状(不运行计算)?
# Given a, b and signature with
# a.shape == (1, 2, 5)
# b.shape == (4, 5)
einsum_shape('ijk,mk->ik', a, b) # returns (1, 5)
解决方案
这是适用于通用输入数量和相关 einsum 表达式的东西,也适用于特定的标量减少情况 -
def einsum_outshape(einsum_expr, inputs):
shps = np.concatenate([in_.shape for in_ in inputs])
p = einsum_expr.split(',')
s = p[:-1] + p[-1].split('->')
if s[-1]=='':
return ()
else:
inop = list(map(list,s))
return tuple(shps[(np.concatenate(inop[:-1])[:,None]==inop[-1]).argmax(0)])
样品运行 -
In [42]: a = np.random.rand(1,2,5)
...: b = np.random.rand(4,5)
...: c = np.random.rand(5,7,8)
...: d = np.random.rand(7,9)
In [43]: einsum_outshape('ijk,mk,kpq,pr->ikpqr', inputs=(a,b,c,d))
Out[43]: (1, 5, 7, 8, 9)
# Reduction to a scalar
In [44]: einsum_outshape('ijk,mk,kpq,pr->', inputs=(a,b,c,d))
Out[44]: ()
推荐阅读
- javascript - 如何使用 sinon 模拟非类成员函数
- angular - Angular7 的 HTML 编辑器
- windows - 导入支持 GPU 的 TensorFlow 时,DLL 加载失败
- python - Pandas Date Groupby & Apply - 性能改进
- reactjs - React redux 更新 flatlist 项目,但将项目转换为数组
- php - PhpWord - TemplateProcessor:错误复制模板
- python-2.7 - 无法在所需位置显示面板
- docker - 使用 pycharm 运行时 Docker 冻结
- python - 有没有办法从一个大文本文件中获取一个 json 数据子集?
- python - 在 Tensorflow 中跨多级范围共享变量