2015-11-22 60 views
0

假设我有一个2d图像,每个点都有相关的坐标(x,y)。 我想在每个点$ i $和其他每个点$ j $找到位置矢量的内积。本质上,两个二维数组的笛卡尔乘积。两个二维数组的笛卡尔乘积

在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个元素。 如果你不需要同时存储所有的值,你可以尝试存储一些值并处理它们并在产生下一个值之前关闭它们。服用笛卡尔积

更简单的办法,将是这样的:

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')