【发布时间】:2020-12-02 08:58:24
【问题描述】:
我有一个函数 f 计算 2 个向量的类似内积的值(函数是对称的,所以 f(x, y) = f(y, x))。它需要 2 个相同大小的 1d 数组并输出一个值。现在我有一个形状为(n, d) 的数据矩阵X(每行代表一个输入向量),我想计算一个形状为(n, n) 的矩阵K,使得K[i][j] = f(X[i], X[j])。一种方法是使用以下代码。
import numpy as np
# ... some other code
K = np.zeros((n, n))
for i in range(n):
for j in range(n):
K[i][j] = f(X[i], X[j])
这可行,但它既不优雅也不高效。
另一种方法是使用 numpy 中的vectorize
import numpy as np
# ... some other code
vf = np.vectorize(f, signature="(n),(n)->()")
# this does not work (output shape (n,))
#K = vf(X, X)
# this works (output shape (n, n))
K = vf(X, X[: np.newaxis])
# this also works (output shape (n, n), result same as above)
#K = vf(X[: np.newaxis], X)
如果我们放入一个(n, d) 的数组和另一个(n, d) 的数组,它将输出一个(n,) 的一维数组,基本上将两个矩阵的每一行n 作为输入,从而产生n 输出。但是,如果我们将其转换为具有(n, 1, d) 形状的X[: np.newaxis],它可以工作,但为什么它可以工作?
【问题讨论】: