【问题标题】:NumPy: Dot product of diagonal elementsNumPy:对角线元素的点积
【发布时间】:2019-04-13 13:53:35
【问题描述】:

考虑x,一个n x 3 向量。

  1. 是否有可能使用numpytensorflow 或任何Python 库的内置方法 来获得n x 1 顺序的向量,使得每一行都是一个向量订单3 x 1?也就是说,如果x是[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]T,可以是 [[1, 2, 3]T, [4, 5, 6]T, [7, 8, 9]T 形式的向量, [10, 11, 12]T]T无需for 循环或引入新轴,例如, np.newaxis?
  2. 这背后的动机是只获得x 的点积及其转置的对角线元素。当然,我们可以做类似np.diag(x.dot(x.T)) 的事情。但是,如果n 很大,比如 202933,则可以听到 CPU 的风扇发出喘息声。如何真正避免做所有元素的点积,而只做幻影点积的对角线而不做迭代?

【问题讨论】:

  • 如果你写出对角元素的公式,我想你这样做没有问题。
  • 顺便说一下,如果x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]).T,我们通常称它为nx3矩阵,而不是3xn
  • 请通过示例阐明您在第 1 部分中的意思。您的符号(例如转置)充其量是模棱两可的。此外,图像的使用完全是免费的。我冒昧地删除了它们。希望我的回答能帮助您解决您遇到的计算问题。

标签: python python-3.x numpy tensorflow


【解决方案1】:

让我们看一下x 乘以它自己的转置结果中每个元素的公式。我不想强迫 Stack Overflow UI 允许我使用张量表示法,所以我们从概念上看。

结果的第 i 行第 j 列的每个元素是x 中的第 i 行和x.T 中的第 j 列的点积。现在x.T 中的第 j 列就是x 中的第 j 行,对角线是 i 和 j 相同的地方。所以你想要的是x 的平方元素行的总和:

d = (x * x).sum(axis=1)

为了解决您问题的第一部分,numpy 中的转置操作很少会复制您的数据,因此 x.Tnp.transpose(x) 即使是最大的数组也是恒定时间操作。原因是 numpy 数组存储为数据块以及一些元数据,如维度、每个维度中元素之间的步幅和数据大小。转置数组只需要修改数组对象中的少量元数据,例如沿每个维度的大小和步幅,而不是复制整个数据集。

耗时的部分是执行乘法。简单地拥有对象xx.T 几乎没有成本:它们都使用相同的数据缓冲区。

【讨论】:

  • einsum 用于性能提升:np.einsum('ij,ij->i',x,x)。 Tensorflow 已经有einsum,所以那里也应该很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2020-09-26
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多