张量流通过多维数组索引

时间:2018-03-12 17:47:31

标签: python arrays numpy tensorflow indexing

我在这里得到了这个概率矩阵,并且我试图将它们编入索引以获得每一行中的一个概率,以便我可以记录它们。

p_matrix = 
[[0.5        0.5      ]
 [0.45384845 0.5461515 ]
 [0.45384845 0.5461515 ]
 [0.45384845 0.5461515 ]
 [0.48519668 0.51480335]
 [0.48257706 0.517423  ]
 [0.48257706 0.517423  ]
 [0.48257706 0.517423  ]
 [0.4807878  0.5192122 ]
 [0.45384845 0.5461515 ]
 [0.48257703 0.517423  ]]

索引存储在占位符a = tf.placeholder(shape=None, dtype=tf.int32)

通常我会做p_matrix[np.arange(a.shape[0], dtype=np.int32), a]

为了获取相应的结果,但这给了我一个错误

IndexError: arrays used as indices must be of integer (or boolean) type

使用标准的numpy数组代替a可以得到所需的结果。我认为使用dtype=tf.int32可能会有一些具体内容,但如果我将占位符的dtype更改为np.int32,我会得到相同的结果。

当我得到type a时,它会返回<class 'numpy.ndarray'>a[0]则会返回<class 'numpy.int32'>

有什么想法吗?

总结:

x = np.arange(a.shape[0])
y = np.array(list(a))

print(action_prob[x,y])  # This works.
print(action_prob[x,a])  # This does not work.

type(a) = <class 'numpy.ndarray'>
type(y) = <class 'numpy.ndarray'>

我只能假设它是因为一个是tf.placeholder,因此我无法在图表初始化中指定它?

编辑:

示例代码:

class Model():
    def __init__(self, sess, s_size, game, lr=0.001):
        f_size = 12
        self.input = tf.placeholder(shape=[None, f_size], dtype=tf.float32)
        self.action = tf.placeholder(shape=None, dtype=tf.int32)

        self.p_matrix = tf.contrib.layers.fully_connected(self.state,
            20, activation_fn=tf.nn.softmax, biases_initializer=None)

        # Here I need to select the correct p_values
        self.log_prob = tf.log(self.action_prob[p_selected])

        self.train = tf.train.AdamOptimizer(lr).minimize(loss=-log_prob)

    def learn(self, s, a, td):
        # a = a.reshape(a.shape[0], 1)  # necessary for the episodes
        feed_dict = {self.input: s, self.action: a}
        p_matrix = self.sess.run(self.p_matrix, feed_dict)

        log_prob, p_matrix = self.sess.run([self.log_prob, self.p_matrix], feed_dict)

        _ = self.sess.run(self.train, feed_dict)

1 个答案:

答案 0 :(得分:2)

您可以使用tf.gather_nd

执行此操作
idx = tf.stack([tf.range(tf.shape(a)[0], dtype=a.dtype), a], axis=1)
p_selected = tf.gather_nd(p_matrix, idx)

idx中的每一行都包含&#34;坐标&#34;要检索的每个元素,如[[0, a[0]], [1, a[1]], ...]