Добавить размеры в тензор и дублировать значения по новым осям - PullRequest
1 голос
/ 25 марта 2019

Предположим, у меня есть 2D ndarray X с

X.shape == (m, n)

Я хотел бы добавить еще два измерения к X, копируя значения вдоль этих новых осей. т.е. я хочу

new_X.shape == (m, n, k, l) 

и для всех я, J

new_X[i, j, :, :] = X[i, j]

Какой лучший способ добиться этого?

1 Ответ

2 голосов
/ 25 марта 2019

Вы можете просто получить тензорное представление с помощью np.broadcast_to -

np.broadcast_to(a[...,None,None],a.shape+(k,l)) # a is input array

Преимущество будет в том, что с ним не будет дополнительной нагрузки на память и, следовательно, будет фактически свободное время работы.

Если вам нужен вывод массива с собственным пространством памяти, добавьте .copy().

Пример выполнения -

In [9]: a =  np.random.rand(2,3)

In [10]: k,l = 4,5

In [11]: np.broadcast_to(a[...,None,None],a.shape+(k,l)).shape
Out[11]: (2, 3, 4, 5)

# Verify memory space sharing
In [12]: np.shares_memory(a,np.broadcast_to(a[...,None,None],a.shape+(k,l)))
Out[12]: True

# Verify virtually free runtime
In [17]: a =  np.random.rand(100,100)
    ...: k,l = 100,100
    ...: %timeit np.broadcast_to(a[...,None,None],a.shape+(k,l))
100000 loops, best of 3: 3.41 µs per loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...