Предположим, что у меня есть 2d-изображение с соответствующими координатами (x, y) в каждой точке. Я хочу найти скалярное произведение вектора положения в каждой точке $ i $ с любой другой точкой $ j $. По существу, декартово произведение двух 2d-массивов.Декартово произведение двух 2-мерных массивов
Что было бы самым быстрым способом для этого, на Python?
Моя текущая реализация выглядит следующим образом:
def cartesian_product(arrays):
broadcastable = np.ix_(*arrays)
broadcasted = np.broadcast_arrays(*broadcastable)
rows, cols = reduce(np.multiply, broadcasted[0].shape), len(broadcasted)
out = np.empty(rows * cols, dtype=broadcasted[0].dtype)
start, end = 0, rows
for a in broadcasted:
out[start:end] = a.reshape(-1)
start, end = end, end + rows
return out.reshape(cols, rows).T
def inner_product():
x, y = np.meshgrid(np.arange(4),np.arange(4))
cart_x = cartesian_product([x.flatten(),x.flatten()])
cart_y = cartesian_product([y.flatten(),y.flatten()])
Nx = x.shape[0]
xx = (cart_x[:,0]*cart_x[:,1]).reshape((Nx**2,Nx,Nx))
yy = (cart_y[:,0]*cart_y[:,1]).reshape((Nx**2,Nx,Nx))
inner_products = xx+yy
return inner_products
(кредит, где кредит из-за: cartesian_product берется из Using numpy to build an array of all combinations of two arrays)
Но это не работает. Для больших массивов (например, 256x256) это дает мне ошибку памяти.