построить попарную матрицу из вектора в тензорном потоке - PullRequest
1 голос
/ 14 марта 2019

Предположим, что у меня есть 1 * 3 вектор [[1,3,5]] (или список типа [1,3,5], если вы с ним), как мне сгенерировать матрицу 9 * 2: [[1,1],[1,3],[1,5],[3,1],[3,3],[3,5],[5,1],[5,3],[5,5]]?

Элементы в новой матрице - это парная комбинация элементов в исходной матрице.

Кроме того, исходная матрица может быть с нулями, как это [[0,1],[0,3],[0,5]].

Реализация должна обобщаться на векторы любой размерности.

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 14 марта 2019

Вы можете использовать tf.meshgrid() и tf.transpose() для генерации двух матриц. Затем измените их и объедините.

import tensorflow as tf

a = tf.constant([[1,3,5]])

A,B=tf.meshgrid(a,tf.transpose(a))
result = tf.concat([tf.reshape(B,(-1,1)),tf.reshape(A,(-1,1))],axis=-1)

with tf.Session() as sess:
    print(sess.run(result))

[[1 1]
 [1 3]
 [1 5]
 [3 1]
 [3 3]
 [3 5]
 [5 1]
 [5 3]
 [5 5]]
1 голос
/ 14 марта 2019

Вы можете использовать product из itertools

from itertools import product
np.array([np.array(item) for item in product([1,3,5],repeat =2 )])


array([[1, 1],
       [1, 3],
       [1, 5],
       [3, 1],
       [3, 3],
       [3, 5],
       [5, 1],
       [5, 3],
       [5, 5]])
0 голосов
/ 14 марта 2019

Я также придумаю ответ, похожий на @giser_yugang, но без использования tf.meshgrid и tf.concat.

import tensorflow as tf 

inds = tf.constant([1,3,5])

num = tf.shape(inds)[0]
ind_flat_lower = tf.tile(inds,[num])
ind_mat = tf.reshape(ind_flat_lower,[num,num])
ind_flat_upper = tf.reshape(tf.transpose(ind_mat),[-1])
result = tf.transpose(tf.stack([ind_flat_upper,ind_flat_lower]))

with tf.Session() as sess:
    print(sess.run(result))


[[1 1]
 [1 3]
 [1 5]
 [3 1]
 [3 3]
 [3 5]
 [5 1]
 [5 3]
 [5 5]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...