我想在向量上广播函数f,使得结果是矩阵P,其中P [i,j] = f(v [i],v [j])。 我知道我可以做到这一点:
P = zeros( (v.shape[0], v.shape[0]) )
for i in range(P.shape[0]):
for j in range(P.shape[0]):
P[i, j] = f(v[i,:], v[j,:])
或更多hacky:
from scipy.spatial.distance import cdist
P = cdist(v, v, metric=f)
但我正在寻找最快最好的方法。 这似乎是numpy应该内置的广播功能。 有什么建议吗?
答案 0 :(得分:1)
我相信你搜索的内容是numpy.vectorize。像这样使用它:
def f(x, y):
return x + y
v = numpy.array([1,2,3])
# vectorize the function
vf = numpy.vectorize(f)
# "transposing" the vector by producing a view with another shape
vt = v.reshape((v.shape[0], 1)
# calculate over all combinations using broadcast
vf(v, vt)
Output:
array([[ 2., 3., 4.],
[ 3., 4., 5.],
[ 4., 5., 6.]])