Это одно из решений:
import numpy as np
import tensorflow as tf
def n_hot_encoding(a, n):
a = tf.convert_to_tensor(a)
m = 1 << np.arange(n)[::-1]
shape = np.r_[np.ones(len(a.shape), dtype=int), -1]
m = m.reshape(shape)
hits = tf.bitwise.bitwise_and(a[..., tf.newaxis], tf.cast(m, a.dtype))
return tf.not_equal(hits, 0)
with tf.Graph().as_default(), tf.Session() as sess:
n_hot = n_hot_encoding([19, 20, 21], 10)
print(sess.run(tf.cast(n_hot, tf.int32)))
Вывод:
[[0 0 0 0 0 1 0 0 1 1]
[0 0 0 0 0 1 0 1 0 0]
[0 0 0 0 0 1 0 1 0 1]]
Предполагается, что N
является регулярным скаляром (не значением TensorFlow) и что числоРазмеры массива для преобразования известны (размер каждого измерения может быть динамическим, но a.shape
не должен быть просто None
).Функция может быть адаптирована для вычислений только TensorFlow следующим образом:
import tensorflow as tf
def n_hot_encoding(a, n):
a = tf.convert_to_tensor(a)
n = tf.convert_to_tensor(n)
m = tf.bitwise.left_shift(1, tf.range(n)[::-1])
shape = tf.concat([tf.ones([tf.rank(a)], dtype=tf.int64), [-1]], axis=0)
m = tf.reshape(m, shape)
hits = tf.bitwise.bitwise_and(a[..., tf.newaxis], tf.cast(m, a.dtype))
return tf.not_equal(hits, 0)
Это должно работать с любым входом, но может выполнять немного больше дополнительной работы при каждом запуске графика.