Создайте логический массив, сравнивая каждую матрицу в тензоре Numpy с другим целым числом в массиве Numpy - PullRequest
1 голос
/ 30 мая 2020

Скажем, у меня есть Numpy тензор X, равный 3 * 3 * 3 (фактические размеры могут отличаться). Я хочу протестировать каждую матрицу в тензоре против другого значения в наборе целых чисел.

Например, если

X=np.array([1,2,3]*9).reshape(3,3,3)
test=np.array([1,2,3])

Желаемый результат будет:

 [[[ True, False, False],
    [True, False, False],
    [True, False, False]],

   [[False,  True, False],
    [False,  True, False],
    [False,  True, False]],

   [[False, False,  True],
    [False, False,  True],
    [False, False,  True]]])

Однако я не могу получить этот результат. X == test возвращает:

array([[[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]],

       [[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]],

       [[ True,  True,  True],
        [ True,  True,  True],
        [ True,  True,  True]]])

Если

test=[[1],[2],[3]] 

я получаю:

array([[[ True, False, False],
        [False,  True, False],
        [False, False,  True]],

       [[ True, False, False],
        [False,  True, False],
        [False, False,  True]],

       [[ True, False, False],
        [False,  True, False],
        [False, False,  True]]])

Тот же результат справедлив и для np.equal. Есть ли какой-нибудь прямой способ сделать это без использования циклов? Похоже, что есть способ, при котором при индексировании

X[[0,1,2],[0,2,1]] 

будет получаться

np.array([X[0][0],X[1][2],X[2][1]])

, а не

X[:,[0,2,1]]

1 Ответ

1 голос
/ 01 июня 2020

Это простое сравнение равенства, но сложная часть - выяснить, как транслировать операцию. Вы можете сделать это как,

X == test[:, None, None]

array([[[ True, False, False],
        [ True, False, False],
        [ True, False, False]],

       [[False,  True, False],
        [False,  True, False],
        [False,  True, False]],

       [[False, False,  True],
        [False, False,  True],
        [False, False,  True]]])

Где,

test[:, None, None]

array([[[1]],

       [[2]],

       [[3]]])

Идея состоит в том, чтобы согласовать размеры X и test, чтобы мы могли транслировать равенство сравнение, поэтому первый элемент test сравнивается с первой подматрицей X, второй элемент сравнивается со второй подматрицей и т. д.

...