Вы можете переписать np.meshgrid как более быстрые операции нижнего уровня numpy:
p = 360; q = 50; r = 50
my_array = np.random.rand(p, q, 2)
res_array = np.zeros((p,q,r), dtype=np.float32)
for i in range(p):
x = my_array[None,i,:,0].repeat(q, axis=0).reshape(q, q)
y = my_array[None,i,:,0].repeat(q, axis=1).reshape(q, q)
res_array[i] = y - x
Этот код в 2 раза быстрее на моей машине. Numba @njit
может использоваться для ускорения вышеуказанного кода (снова в 3 раза быстрее), но с его помощью возможна гораздо более эффективная реализация. Вот он:
@njit(parallel=True)
def fasterImpl(my_array, p, q, r):
res_array = np.zeros((p, q, r))
for i in prange(p):
for j in range(q):
for k in range(r):
res_array[i,j,k] = my_array[i,j,0] - my_array[i,k,0]
return res_array
p = 360; q = 50; r = 50
my_array = np.random.rand(p, q, 2)
res_array = fasterImpl(my_array, p, q, r)
Эта финальная реализация в 29 раз быстрее, чем исходная на моей машине!