背景:我正在研究一个历史上依赖稀疏矩阵进行大量数学计算的项目,并开发一个插件来将一些繁重的工作外包给theano。由于theano的稀疏支持是有限的,我们首先建立一个密集的版本 - 但希望这解释了为什么我们对下面的方法感兴趣。
任务:将一些运算符仅应用于矩阵的非零值。
以下子程序大部分时间都有效:
import theano.sparse.basic as TSB
def _applyOpToNonzerosOfDense(self,op,expr):
sparseExpr = TSB.clean(TSB.csr_from_dense(expr))
newData = op(TSB.csm_data(sparseExpr)).flatten()
newSparse = TS.CSR(newData, \
TSB.csm_indices(sparseExpr), \
TSB.csm_indptr(sparseExpr), \
TSB.csm_shape(sparseExpr))
ret = TSB.dense_from_sparse(newSparse)
return ret
问题出现在expr
不是规范矩阵张量,而是行张量(因此,expr
是1xN而expr.broadcastable
是(True, False)
)。当发生这种情况时,我们需要能够在返回的张量中保留或恢复广播状态。
我尝试过的一些不起作用的事情:
dense_from_sparse
不支持可播放设置ret.broadcastable
ret.dimshuffle( ('x',1) )
失败并显示“您无法删除不可广播的维度。” ret
已经(应该)具有与expr
完全相同的形状,所以我并不认为这很难。如何恢复广播设置?