Numpy 和 Theano 中索引赋值的区别 set_subtensor()
Differences between index-assignment in Numpy and Theano's set_subtensor()
我正在尝试使用 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
这突出了 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])
我正在尝试使用 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
这突出了 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])