我有两个numpy数组X
和Y
,其形状为X.shape == (m,d)
和Y.shape == (n,d)
,其中m
,n
和{ {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
:
Z
数组((n,m,d)
双精度数将适合内存,但n*m
双精度数不会存在)有谁知道这样做的方法?提前谢谢。
答案 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])
如果有帮助,请告诉我。