Есть ли более быстрый способ сделать это в Numpy? - PullRequest
1 голос
/ 08 ноября 2019

Я хочу создать трехмерную матрицу в NumPy. Код:

mean_value = np.array([1, 2, 3], dtype=np.float32)
h, w = 5, 5
b = np.ones((h, w, 1), dtype=np.float32) * np.reshape(mean_value, [1, 1, 3])
print(b.shape)  # (5, 5, 3)

Есть ли более быстрый способ генерации b? Спасибо.

1 Ответ

2 голосов
/ 08 ноября 2019

Для эффективности (память, производительность), просто broadcast с np.broadcast_to для вывода представления -

np.broadcast_to(mean_value,(h,w,)+mean_value.shape)

Будучи представлением, оно не имеет дополнительной памяти и, следовательно,, практически бесплатно во время выполнения.

Давайте проверим часть производительности -

In [45]: mean_value = np.array([1, 2, 3], dtype=np.float32)
    ...: h, w = 5, 5

In [46]: %timeit np.broadcast_to(mean_value,(h,w,)+mean_value.shape)
100000 loops, best of 3: 3.21 µs per loop

In [47]: mean_value = np.random.rand(10000)
    ...: h, w = 5000, 5000

In [48]: %timeit np.broadcast_to(mean_value,(h,w,)+mean_value.shape)
100000 loops, best of 3: 3.22 µs per loop

И часть памяти (будучи представлением) -

In [49]: np.shares_memory(mean_value,np.broadcast_to(mean_value,(h,w,)+mean_value.shape))
Out[49]: True
...