功能应用和减少大型阵列

时间:2013-03-30 04:41:03

标签: python numpy reduce large-data

我有两个numpy数组XY,其形状为X.shape == (m,d)Y.shape == (n,d),其中mn和{ {1}}是非平凡的尺寸。我需要创建一个形状为d的第三个数组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

  1. 尽可能利用numpy的优化
  2. 执行此操作而不在内存中放置一个形状Z数组((n,m,d)双精度数将适合内存,但n*m双精度数不会存在)
  3. 有谁知道这样做的方法?提前谢谢。

1 个答案:

答案 0 :(得分: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])

如果有帮助,请告诉我。