произведение умножения на тензор

1

У меня есть 4 x 4 матрицы

import numpy as np
c = np.random.rand((4,4))

Я хочу создать тензор 100 x 4 x 4 x 100, так что, когда первый последний индекс равен, я возвращаю свою матрицу, иначе получаю нули.

Я могу сделать это в цикле, как

Z = np.zeros((100, 4, 4, 100))
for i in range(100):
    Z[i, :, :, i] = c

Есть лучший способ сделать это? Я попытался посмотреть на np.tensordot и np.einsum, но не мог понять.

Спасибо, Сахил

Теги:
numpy
tensor

1 ответ

1
Лучший ответ

Используйте advanced-indexing -

n = 100
Zout = np.zeros((n, 4, 4, n))
I = np.arange(n)
Zout[I,:,:,I] = c

С eye-masking -

n = 100
mask = np.eye(n, dtype=bool)
Zout = np.zeros((n, 4, 4, n))
Zout.transpose(0,3,1,2)[mask] = c

Сроки -

In [72]: c = np.random.rand(4,4)

In [73]: %%timeit
    ...: n = 100
    ...: Zout = np.zeros((n, 4, 4, n))
    ...: I = np.arange(n)
    ...: Zout[I,:,:,I] = c
10000 loops, best of 3: 47.5 µs per loop

In [74]: %%timeit
    ...: n = 100
    ...: mask = np.eye(n, dtype=bool)
    ...: Zout = np.zeros((n, 4, 4, n))
    ...: Zout.transpose(0,3,1,2)[mask] = c
10000 loops, best of 3: 73.1 µs per loop
  • 0
    Большое спасибо. Я надеялся, что найдется какая-нибудь функция, которая бы взяла np.eye(100) и c чтобы придумать Z
  • 1
    Я думаю, что @SahilPuri индексирование с помощью np.eye не будет таким эффективным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню