python - 对平方数组求和

标签 python numpy linear-algebra

作为批量欧氏距离计算的一部分,我正在计算

(X * X).sum(axis=1)

其中 X 是一个相当大的二维数组。这工作正常,但它构造了一个与 X 大小相同的临时数组。有什么方法可以摆脱这种临时性,但又能保持矢量化操作的效率?

明显的候选人,

np.array([np.dot(row, row) for row in X])

有效,但使用 Python 列表作为临时列表,使其相当慢。

如果没有,内存效率的形式将是

(X * X).sum()  =>  np.dot(X.ravel(), X.ravel())

我知道,当 axis=1 时,它等同于

np.diag(np.dot(X, X.T))

这让我研究了 dot 的概括,例如 np.innernp.tensordotnp.einsum,但我不知道他们将如何解决我的问题。

最佳答案

einsum 等价于:

np.einsum('ij,ij->i', X, X)

虽然我不确定这在内部是如何工作的,所以它可能会或可能不会解决您的问题。

关于python - 对平方数组求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19094441/

相关文章:

python - 无法理解余弦相似度的python函数

python - 使用 Pandas 读取 CSV 时如何在列中保持前导零?

python - 用python解压大于内存的文件

python - 如何在 pySpark 数据框中添加行 ID

python - 在Python中沿轴广播/扩展 bool 数组

python - 是否可以通过 Python 中的另一个字符串列表过滤子字符串列表?

c++ - 以具有复数元素和下三角方阵 A 矩阵的线性最小二乘法求解系统 Ax=b

python - 正则表达式排除特定模式python

python - Matplotlib 和 Numpy - 创建日历热图

c++ - 奇异矩阵的高斯消元