Numpy中的索引赋值与Theano的set_subtensor()之间的差异

时间:2015-09-27 22:41:55

标签: theano

我正在尝试使用set_subtensor()在Theano中进行索引赋值,但是它给Numpy的索引赋值提供了不同的结果。我做错了什么,或者这对set_subtensor和Numpy的索引分配有何影响?

我想做什么:

X = np.zeros((2, 2))
X[[[0, 1], [0, 1]]] = np.array([1, 2])

X is now:
[[ 1.  0.]
 [ 0.  2.]]

试图在Theano做同样的事情:

X = theano.shared(value=np.zeros((2, 2)))
X = T.set_subtensor(X[[[0, 1], [0, 1]]], np.array([1, 2]))
X.eval()

引发此错误

ValueError: array is not broadcastable to correct shape

1 个答案:

答案 0 :(得分:2)

这凸显了numpy和Theano之间的细微差别,但它可以轻松解决。

通过使用位置列表或位置元组,可以在numpy中启用高级索引。在Theano中,人们只能使用位置元组。

如此改变

X = T.set_subtensor(X[[[0, 1], [0, 1]]], np.array([1, 2]))

X = T.set_subtensor(X[([0, 1], [0, 1])], np.array([1, 2]))

解决了Theano中的问题。

如果更改

,则会继续在numpy中获得相同的结果
X[[[0, 1], [0, 1]]] = np.array([1, 2])

X[([0, 1], [0, 1])] = np.array([1, 2])