Мы могли бы просто получить представление о входе с помощью np.broadcast_to
, чтобы получить желаемый результат -
matA = np.broadcast_to(matB[:,:,:,None,None], matB.shape + (N,M))
Будучи представителем, это практически бесплатно -
In [292]: matB = np.random.rand(20,20,20)
In [293]: N,M = 20,20
In [294]: %timeit np.broadcast_to(matB[:,:,:,None,None], matB.shape + (N,M))
100000 loops, best of 3: 4.02 µs per loop
Если вам нужен выход с собственным пространством памяти, создайте копию с помощью matA.copy()
.
В качестве альтернативы, мы могли бы использовать np.repeat
-
np.repeat(matB[:,:,:,None],N*M,axis=-1).reshape(matB.shape+(N,M))