tf.math.bincount
Подсчитывает количество вхождений каждого значения в целочисленном массиве.
tf.math.bincount(
arr,
weights=None,
minlength=None,
maxlength=None,
dtype=tf.dtypes.int32,
name=None,
axis=None,
binary_output=False
)
Если minlength и maxlength не заданы, возвращается вектор длины tf.reduce_max(arr) + 1, если arr не пуст, и вектор нулевой длины в противном случае.
values = tf.constant([1,1,2,3,2,4,4,5]) tf.math.bincount(values) <tf.Tensor: ... numpy=array([0, 2, 2, 1, 2, 1], dtype=int32)>
Длина вектора = максимальный элемент в векторе values равен 5. Прибавление 1, то есть 6, даст длину вектора.
Каждое значение в выходном массиве указывает количество вхождений соответствующего индекса. Здесь значение по индексу 1 в выходном массиве равно 2. Это означает, что значение 1 встречается в values два раза.
Подсчёт количества элементов с весами
values = tf.constant([1,1,2,3,2,4,4,5]) weights = tf.constant([1,5,0,1,0,5,4,5]) tf.math.bincount(values, weights=weights) <tf.Tensor: ... numpy=array([0, 6, 0, 1, 9, 5], dtype=int32)>
Если задан weights, соответствующие бины будут увеличиваться на соответствующий вес, а не на 1. Здесь значение по индексу 1 в выходном массиве равно 6. Это сумма weights, соответствующих значению в values (то есть для индекса 1 первые два значения равны 1, поэтому складываются первые два веса — 1 и 5).
Подсчёт количества элементов с весами эквивалентен unsorted_segement_sum, где data — это веса, а segment_ids — значения.
values = tf.constant([1,1,2,3,2,4,4,5]) weights = tf.constant([1,5,0,1,0,5,4,5]) tf.math.unsorted_segment_sum(weights, values, num_segments=6).numpy() array([0, 6, 0, 1, 9, 5], dtype=int32)
На GPU bincount с весами поддерживается только при включённом XLA (обычно при использовании функции с декоратором @tf.function(jit_compile=True)). Для обхода этого ограничения в случае GPU без XLA можно использовать unsorted_segment_sum.
Независимый подсчёт элементов в строках матрицы
В этом примере axis=-1 применяется к двумерному входному массиву и возвращает Tensor с подсчётом количества элементов, при котором ось 0 не преобразуется в одномерный массив, то есть подсчёт выполняется независимо для каждой строки матрицы.
data = np.array([[1, 2, 3, 0], [0, 0, 1, 2]], dtype=np.int32)
tf.math.bincount(data, axis=-1)
<tf.Tensor: shape=(2, 4), dtype=int32, numpy=
array([[1, 1, 1, 1],
[2, 1, 1, 0]], dtype=int32)>Подсчёт количества элементов с binary_output
В этом примере возвращается двоичный результат вместо количества вхождений.
data = np.array([[1, 2, 3, 0], [0, 0, 1, 2]], dtype=np.int32)
tf.math.bincount(data, axis=-1, binary_output=True)
<tf.Tensor: shape=(2, 4), dtype=int32, numpy=
array([[1, 1, 1, 1],
[1, 1, 1, 0]], dtype=int32)>Отсутствующие нули в SparseTensor
Обратите внимание, что отсутствующие нули (неявные нули) в SparseTensor НЕ учитываются. Это позволяет обрабатывать такие случаи, как 0 в тензоре значений, указывающий на наличие индекса/идентификатора 0, а отсутствующий ноль — на отсутствие индекса/идентификатора.
Если требуется учитывать отсутствующие нули, можно использовать обходные решения. В случае axis=0 количество отсутствующих нулей можно вычислить, вычтя количество элементов в тензоре values SparseTensor из количества элементов в плотной форме, а затем прибавить эту разницу к первому элементу результата bincount. Во всех случаях перед вызовом tf.math.bincount SparseTensor можно преобразовать в плотный Tensor с помощью tf.sparse.to_dense.
| Аргументы | |
|---|---|
arr | Tensor, RaggedTensor или SparseTensor, значения которого нужно подсчитать. Если axis=-1, эти тензоры должны иметь ранг 2. |
weights | Если значение не None, оно должно иметь ту же форму, что и arr. Для каждого значения в arr соответствующий бин будет увеличен на соответствующий вес, а не на 1.
|
minlength | Если задано, гарантирует, что длина результата будет не меньше minlength; при необходимости в конец добавляются нули. |
maxlength | Если задано, пропускает значения в arr, равные maxlength или превышающие его, гарантируя, что длина результата будет не больше maxlength. |
dtype | Если weights имеет значение None, определяет тип выходных бинов. |
name | Область имён для связанных операций (необязательный параметр). |
axis | Ось, по которой выполняется разбиение. Оси начиная с axis и ниже преобразуются в одномерный массив перед подсчётом. В настоящее время поддерживаются только 0 и -1. Если значение None, преобразуются в одномерный массив все оси (эквивалентно передаче 0). |
binary_output | Если True, эта операция возвращает 1 вместо количества вхождений токена (эквивалентно one_hot + reduce_any вместо one_hot + reduce_add). По умолчанию — False. |
| Возвращает | |
|---|---|
Вектор с тем же типом данных, что и weights или заданный dtype, содержащий значения подсчёта. |
| Вызывает исключение | |
|---|---|
InvalidArgumentError, если на вход переданы отрицательные значения. |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/math/bincount