2

我有两个 numpy 数组,X它们Y的形状是X.shape == (m,d)and Y.shape == (n,d), where mnd是非平凡的大小。我需要制作第三个Z形状为Z.shape == (m,n).

对于某些非线性,元素Z[i,j]是对f(X[i,k],Y[j,k]) for k in range(d)所有 进行求和然后求和的结果。k f

显而易见的方法是这样做:

Z = numpy.zeros((m,n), dtype = numpy.float64)
for i in range(m):
    for j in range(n):
        Z[i,j] += (f(X[i,:],Y[j,:])).sum() # I can compose f from ufuncs

但我真正要问的是,是否有某种聪明的广播技巧可以用来计算Z

  1. 如果可能的话,利用 numpy 的优化
  2. 执行此操作而不将形状数组(n,m,d)放入内存(n*m双打将适合内存,但n*m*d双打不会)

有谁知道这样做的方法?提前致谢。

4

1 回答 1

1

这是您不想要的解决方案,我已将其包括在内,因为我相信这是您问题的“规范”解决方案。

# A simple function of x, y
def f(x, y):
    return 2*x + 3*y**2

x = x.reshape((m, 1, d))
y = y.reshape((1, n, d))
temp = f(x, y)
Z = temp.sum(2)

如果您想避免创建temp非常大的临时数组,您可以尝试遍历d维度。在某些情况下,以下循环的开销将非常小,您将获得几乎相同的性能,而内存使用量要少得多。

Z = np.zeros((m, n))
for i in range(d):
    Z += f(x[:, :, i], y[:, :, i])

让我知道这是否有帮助。

于 2013-03-30T05:57:49.983 回答