交换符号矩阵的行

2024-06-11 14:55:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实施并行回火吉布斯采样使用的。我试图创建一个接受矩阵X并交换其中一些行的Theano函数。我有一个名为swaps的符号二进制向量,它表示应该交换哪些行(例如,如果swaps[i] == 1,那么X[i]和{}应该交换)。交换的顺序对我来说并不重要。在

我试图写一个theano.scan,它穿过swaps向量,并逐行执行X的交换。问题是Theano不允许使用符号变量执行X[pos], X[pos + 1] = X[pos + 1], X[pos]之类的操作。下面是我要做的事情的一个简单的代码片段。在

import numpy as np

import theano
import theano.tensor as T

def swap(swp, pos, idx):
    if swp: idx[pos], idx[pos + 1] = idx[pos + 1], idx[pos]
    return idx

max_length = 10
swaps = T.ivector('swaps')
idx   = T.ivector('idx')
pos   = T.iscalar('pos')

new_idx, updates = theano.scan(swap,
                               sequences=[swaps, T.arange(max_length)],
                               outputs_info=idx)

do_swaps = theano.function([swaps, idx], new_idx[-1], updates=updates)

idx_swapped = do_swaps(np.array([1, 1, 0, 1]), np.arange(5))
print idx_swapped

有什么办法让我做得对吗?在


Tags: posimportscanasnp符号theano向量
1条回答
网友
1楼 · 发布于 2024-06-11 14:55:36

好吧,这是我找到的一个非常简单的解决方案。在

import numpy as np

import theano
import theano.tensor as T

def swap(swp, pos, X):
    return T.concatenate([X[:pos],X[[pos+swp]],X[[pos+1-swp]],X[pos+2:]])

max_length = 10
swaps = T.ivector('swaps')
pos   = T.iscalar('pos')
X     = T.vector('X')

new_X, _ = theano.scan(swap,
                       sequences=[swaps, T.arange(max_length)],
                       outputs_info=X)

do_swaps = theano.function([swaps, X], new_X[-1])

X_swapped = do_swaps(np.array([1, 1, 0, 1], dtype='int32'), np.arange(5))
print X_swapped

然而,我不确定它是最佳的还是不在一个GPU上执行。在

相关问题 更多 >