两个2d阵列的笛卡尔积

时间:2015-11-22 21:47:38

标签: python arrays numpy 2d cartesian-product

假设我有一个二维图像,每个点都有相关的坐标(x,y)。 我想在每个点$ i $找到位置向量的内积,每隔一个点$ j $。基本上,两个2d阵列的笛卡尔积。

在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),这给了我一个内存错误。

1 个答案:

答案 0 :(得分:0)

您可能正在存储生成的笛卡尔积 你正在使用二维数组的产品。 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')
相关问题