Нарезать каждый элемент, кроме каждого nth - PullRequest
0 голосов
/ 20 февраля 2019

В тензорном потоке можно выбрать каждый n-й элемент с пометкой нарезки [::n].

Но как сделать обратное?Я хочу выбрать каждый элемент, кроме каждого nth.

Например:

a = [1, 2, 3, 4, 5, 6, 7, 8]

a[2::3] приведет к [3, 6]

Теперь я хотел бы получитьнапротив: [1, 2, 4, 5, 7, 8]

Приведенный выше массив является лишь примером.Решение должно работать для больших матриц измерения [партия, ширина, высота, каналы] в тензорном потоке.Выбор осуществляется только по каналам.Также моя матрица содержит реальные значения, которые не являются уникальными.Я также не смогу изменить его дальше, чем до двух измерений ([batch, channels])

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Вы можете использовать метод np.delete () :

>>> np.delete(a, a[1::3])
array([1, 2, 4, 5, 7, 8])

Помня, что эта операция не изменяет исходный массив:

ReturnНовый массив с вложенными массивами вдоль оси удален.Для одномерного массива это возвращает те записи, которые не возвращены arr [obj].

0 голосов
/ 20 февраля 2019

Простое приложение numpy.setdiff1d () будет работать для 1D-массивов int dtype.

In [16]: arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])

In [17]: np.setdiff1d(arr, arr[2::3])
Out[17]: array([1, 2, 4, 5, 7, 8])

Соответствующий эквивалент TensorFlow равен tf.setdiff1d()


Для обработки массивов nD (т. Е. Тензоров) вы можете сначала преобразовать их в одномерные массивы, выполнить выделение с помощью setdiff1d, а затем преобразовать результат обратно в nD.

0 голосов
/ 20 февраля 2019

Один из вариантов - создать логический индекс, протестировав индекс диапазона:

import numpy as np
start, step = 2, 3
a[np.arange(len(a)) % step != start]
# array([1, 2, 4, 5, 7, 8])

Аналогичным образом можно добиться этого в тензорном потоке, используя tf.boolean_mask:

import tensorflow as tf

a = tf.constant([1, 2, 3, 4, 5, 6, 7, 8])

start, step = 2, 3
mask = ~tf.equal(tf.range(a.shape[-1]) % step, start)

tf.boolean_mask(a, mask).eval()
# array([1, 2, 4, 5, 7, 8], dtype=int32)

Если a - тензор ND, ось можно указать с помощью boolean_mask;4D тензор [партия, ширина, высота, каналы] , например, для выбора по четвертой оси, то есть channels, вы можете установить axis=3:

mask = ~tf.equal(tf.range(a.shape[-1]) % step, start)
tf.boolean_mask(a, mask, axis=3)
...