Создать тензор из другого с условием

1

У меня такой тензор

...
0
0
2
0
1
0
3
1
0
0
0
0
2
3
...

и я должен найти способ создать тензор той же формы, но только с 0 и 1. Он должен находиться в том же положении, что и конкретное число. Вот пример

# for number 2
...
0
0
1
0
0
0
0
0
0
0
0
0
1
0
...

Есть ли встроенная функция, которая может это сделать? Я не могу найти что-либо в Интернете и в документации.

Тогда я должен умножить этот тензор на список чисел, подобных этому

l = [..., 1.3, 4.3, ...]

для получения этого

...
0
0
1.3
0
0
0
0
0
0
0
0
0
4.3
0
...

Есть ли способ получить этот результат?

редактировать

У меня возникли проблемы с применением этого метода в моем случае. Я объясню это. Мой тензор, в котором нужно принимать индексы, выглядит следующим образом:

points = tf.constant([[[0], [1], [0], [2], [1], [0], [2], [2], [0], [1]],
                      [[1], [2], [0], [0], [1], [0], [1], [2], [0], [2]],
                      [[0], [2], [1], [0], [2], [0], [1], [2], [0], [1]]], dtype=tf.float32)
# shape=(3, 10, 1)

Я должен принимать индексы только первого ряда, поэтому я беру их таким образом

idx = tf.cast(tf.where(tf.equal(tf.slice(points, [0, 0, 0], [1, 10, 1]), tf.constant([2], dtype=tf.float32))), dtype=tf.int32)
# shape=(3, 3)
idx = tf.expand_dims(idx, 0)
# shape=(1, 3, 3)

Значения для подачи находятся внутри списка, называемого vectors и я преобразовал их в одну и ту же форму

to_feed = np.expand_dims(np.array(vectors), 0)
# shape=(1, 3, 3)

и затем применяю метод таким образом

res = tf.scatter_nd(idx, to_feed, tf.shape(tf.slice(points, [0, 0, 0], [1, 10, 3])))

Но я получаю эту ошибку

ValueError: The inner 0 dimensions of output.shape=[?,?,?] must match the inner 1 dimensions of updates.shape=[1,3,3]: Shapes must be equal rank, but are 0 and 1 for 'ScatterNd' (op: 'ScatterNd') with input shapes: [1,3,3], [1,3,3], [3].

То, что мне нужно в конце, является тензором, подобным этому

to_feed = [[[10, 10, 10], [11, 11, 11], [12, 12, 12]]] # shape=(1, 3, 3)
res = [[[0, 0, 0], [10, 10, 10], [0, 0, 0], [11, 11, 11], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [12, 12, 12], [0, 0, 0]]] # shape=(1, 10, 3)

([0, 0, 0] помещаются случайным образом, чтобы иметь представление)

Теги:
tensorflow

1 ответ

2
Лучший ответ

Вы можете просто сравнить с tf.equal а затем преобразовать логический результат в число с помощью tf.cast:

import tensorflow as tf

vector = tf.placeholder(tf.int32, [None])
num = tf.placeholder(tf.int32, [])
result = tf.cast(tf.equal(vector, num), tf.int32)
with tf.Session() as sess:
    print(sess.run(result, feed_dict={vector: [0, 0, 2, 1, 0, 3, 2, 0], num: 2}))

Выход:

[0 0 1 0 0 0 1 0]

РЕДАКТИРОВАТЬ:

Вышеупомянутый решает более простой первый вопрос, но я думаю, что вам нужно решить вашу проблему, это что-то вроде следующего: tf.where и tf.scatter_nd:

import tensorflow as tf

vector = tf.placeholder(tf.int32, [None])
num = tf.placeholder(tf.int32, [])
values = tf.placeholder(tf.float32, [None])
idx = tf.where(tf.equal(vector, num))
result = tf.scatter_nd(idx, values, tf.cast(tf.shape(vector), idx.dtype))
with tf.Session() as sess:
    print(sess.run(result, feed_dict={vector: [0, 2, 1, 2, 3, 2, 2, 0],
                                      num: 2,
                                      values: [3, 4.4, 2, 2.2]}))

Выход:

[0.  3.  0.  4.4 0.  2.  2.2 0. ]

РЕДАКТИРОВАТЬ:

В вашем последнем примере я собрал фрагмент для того, что, как я думаю, вы пытаетесь достичь:

import tensorflow as tf

points = tf.constant([[[0], [1], [0], [2], [1], [0], [2], [2], [0], [1]],
                      [[1], [2], [0], [0], [1], [0], [1], [2], [0], [2]],
                      [[0], [2], [1], [0], [2], [0], [1], [2], [0], [1]]], dtype=tf.float32)
vectors = tf.constant([[10, 11, 12], [20, 21, 22], [30, 31, 21]], dtype=tf.float32)

points_row = points[:1]
idx = tf.where(tf.equal(points_row, 2))
idx = tf.cast(idx, tf.int32)
res_shape = tf.concat([tf.shape(points_row), [tf.shape(vectors)[1]]], axis=0)
res = tf.scatter_nd(idx, vectors, res_shape)
res = tf.squeeze(res, 2)

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

Выход:

[[[ 0.  0.  0.]
  [ 0.  0.  0.]
  [ 0.  0.  0.]
  [10. 11. 12.]
  [ 0.  0.  0.]
  [ 0.  0.  0.]
  [20. 21. 22.]
  [30. 31. 21.]
  [ 0.  0.  0.]
  [ 0.  0.  0.]]]
  • 0
    Спасибо! а для второй части? У тебя есть идея?
  • 0
    @ Пользователь А, подожди, я не правильно понял. Вы должны быть в состоянии просто умножить один тензор с другим с * оператора (при условии, что они имеют совместимые размеры). Просто обратите внимание, что вам, вероятно, придется приводить результат так, чтобы типы данных соответствовали (например, если ваш второй тензор имеет тип tf.float32 , то вы должны использовать tf.cast вместо него tf.int32 ).
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню