У меня есть 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, но не мог понять.
Спасибо, Сахил
Используйте 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
np.eye(100)
иc
чтобы придуматьZ