随着最近对Numpy(1.14)的更新,我发现它破坏了我的整个代码库。这是基于将默认的numpy einsum optimize参数从False更改为True。在
因此,以下基本操作现在失败:
a = np.random.random([50, 2, 2])
b = np.random.random([50, 2])
np.einsum('bdc, ac -> ab', a, b, optimize=True)
具有以下错误跟踪:
^{pr2}$我要求einsum做的手术看起来很简单。。。那为什么失败呢?如果我设置“optimize=False”,就可以了。在
我尝试使用einsum_path进行探索,但是结果是路径信息在优化和不优化的情况下是相同的。在
我看不出优化与这个错误有什么关系。在
对于第一个参数
^{pr2}$b,d,c
是50,2,2。第二个a,c
是50,2。结果应该是50,50。但是d
怎么了?在哎呀:
所以它是在
d
上求和。在注意这个错误-对于优化,它使用
tensordot
(转置加dot
),而不是原来的einsum
nditer
方法。在c_einsum
是可以处理丢失的d
:尝试了一些时间安排:
两步计算和默认优化:
所需的
c_einsum
更快事实上,
c_einsum
甚至在tensordot
版本工作时也更快这个例子可能太小,无法展示
tensordot/blas
的优点。在看起来这是github上引发的问题-包括失败和较慢的“优化”速度:https://github.com/numpy/numpy/issues/10343“einsum广播回归(with optimize=True)”
相关问题 更多 >
编程相关推荐