Вы, конечно, можете взглянуть на источник для np.kron
. Его можно найти в numpy/lib/shape_base.py
, и вы можете увидеть, есть ли улучшения, которые можно сделать, или упрощения, которые могут сделать его более эффективным. В качестве альтернативы вы можете написать свой собственный, используя Cython или какой-либо другой язык привязки к языку низкого уровня, чтобы попытаться добиться лучшей производительности.
Или, как сказал @matt, что-то вроде следующего может быть быстрее:
import numpy as np
nrows = 10
a = np.arange(100).reshape(10,10)
b = np.tile(a,nrows).reshape(nrows*a.shape[0],-1) # equiv to np.kron(a,np.ones((nrows,1)))
или
b = np.repeat(a,nrows*np.ones(a.shape[0],np.int),axis=0)
Тайминги:
In [80]: %timeit np.tile(a,nrows).reshape(nrows*a.shape[0],-1)
10000 loops, best of 3: 25.5 us per loop
In [81]: %timeit np.kron(a,np.ones((nrows,1)))
10000 loops, best of 3: 117 us per loop
In [91]: %timeit np.repeat(a,nrows*np.ones(a.shape[0],np.int),0)
100000 loops, best of 3: 12.8 us per loop
Использование np.repeat
для массивов размеров в приведенном выше примере дает довольно хорошее ускорение в 10 раз, что не так уж и плохо.