2015-11-22 7 views
0

Предположим, что у меня есть 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) это дает мне ошибку памяти.

ответ

0

Возможно, вы храните сгенерированный декартовой продукт.
Вы берете продукт 2-мерных массивов. Продукт mxm и nxn-матриц будет производить (m m n * n).
Для 256 * 256 матриц он будет генерировать 2^32 = 4 294 967 296 элементов. Если вам не нужны все значения в одно и то же время, вы можете попробовать сохранить несколько и обработать их и избавиться от них, прежде чем генерировать следующие значения.

Simpler способ взять декартово произведение, было бы как:

import itertools 

xMax = 2 
yMax = 2 
m1 = [ [ (x + y*xMax) for x in range(xMax)] for y in range(yMax)] 
print("m1=" + `m1`) 
m2 = [ [ chr(ord('a') + (x + y*xMax)) for x in range(xMax)] for y in range(yMax)] 
print("m2=" + `m2`) 
for x in m1 : 
    for y in m2: 
     for e in itertools.product(x,y): #generating xMax *xMax at at time, process one by one or in batch 
      print e 

Приведенный выше код будет генерировать следующий вывод

m1=[[0, 1], [2, 3]] 
m2=[['a', 'b'], ['c', 'd']] 
(0, 'a') 
(0, 'b') 
(1, 'a') 
(1, 'b') 
(0, 'c') 
(0, 'd') 
(1, 'c') 
(1, 'd') 
(2, 'b') 
(2, 'a') 
(3, 'a') 
(3, 'b') 
(2, 'c') 
(2, 'd') 
(3, 'c') 
(3, 'd') 
Смежные вопросы