Побитовая операция над одиночной матрицей в тензорном потоке 2 - PullRequest
1 голос
/ 09 января 2020

Допустим, у меня есть матрица

M = np.array([
    [0, 1, 0, 0, 0],
    [1, 0, 1, 1, 1],
    [1, 1, 1, 1, 1],
    [0, 1, 1, 0, 1],
], dtype=np.int32)

И я хочу сделать побитовую операцию (например, bitwise_and) для всех строк.

В numpy Я могу сделать это так :

res = np.bitwise_and.reduce(M, axis=1)
print(res)

Как я могу сделать то же самое в тензорном потоке? В настоящее время я делаю это так:

tensor = tf.Variable(M)
res = tensor[:, 0]
for i in range(1, M.shape[1]):
    res = tf.bitwise.bitwise_and(res, tensor[:, i])
print(res.numpy())

Я хочу избежать цикла.

1 Ответ

1 голос
/ 09 января 2020

Это можно сделать с помощью операций сокращения, таких как tf.reduce_all:

import tensorflow as tf

tensor = tf.constant([[True, False, True], [False, True, False], [True, True, True]])
res = tf.reduce_all(tensor, axis=1)
print(res.numpy())
# [False False  True]

РЕДАКТИРОВАТЬ: если вы хотите конкретно побитовую операцию (т. Е. Ваш ввод не двоичный) , тогда я не думаю, что для этого есть операция сокращения, но вы можете сделать что-то подобное с tf.scan (хотя это, вероятно, не будет так быстро):

import tensorflow as tf

tensor = tf.constant([
    [0, 1, 2],
    [3, 6, 7],
], dtype=tf.int32)
# Put reduction dimension first
tensor_t = tf.transpose(tensor)
# Compute cumulative bitwise and
res_cum = tf.scan(tf.bitwise.bitwise_and, tensor_t)
# The last result is the total reduction
res = res_cum[-1]
print(res.numpy())
# [0 2]
...