Вот один, используя vectorized-linspace : create_ranges
-
# https://stackoverflow.com/a/40624614/ @Divakar
def create_ranges(start, stop, N, endpoint=True):
if endpoint==1:
divisor = N-1
else:
divisor = N
steps = (1.0/divisor) * (stop - start)
return steps[:,None]*np.arange(N) + start[:,None]
def linspace_nd(x,y,gridrez):
a1 = create_ranges(x.min(1), x.max(1), N=gridrez, endpoint=True)
a2 = create_ranges(y.min(1), y.max(1), N=gridrez, endpoint=True)
out_shp = a1.shape + (a2.shape[1],)
Xout = np.broadcast_to(a1[:,None,:], out_shp)
Yout = np.broadcast_to(a2[:,:,None], out_shp)
return Xout, Yout
Окончательные выходные значения при linspace_nd
будут 3D
сеточными представлениями в векторизованные выходные данные linspace и, как таковые, будут эффективными с точки зрения памяти и, следовательно, хорошими с точки зрения производительности.
В качестве альтернативы, если вам нужны выходные данные с собственными областями памяти, а не с представлениями, вы можете использовать np.repeat
для репликаций -
Xout = np.repeat(a1[:,None,:],a2.shape[1],axis=1)
Yout = np.repeat(a2[:,:,None],a1.shape[1],axis=2)
Сроки создания такого массива с views
-
In [406]: np.random.seed(0)
...: x = np.random.rand(1000,5)
...: y = np.random.rand(1000,5)
In [408]: %timeit linspace_nd(x,y,gridrez=10)
1000 loops, best of 3: 221 µs per loop