NumPy:对角元素的点积

时间:2019-04-13 13:53:36

标签: python python-3.x numpy tensorflow

考虑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风扇喘气的声音。如何真正避免对所有元素进行点积运算,而仅对幻影点积的对角线元素进行运算而无需迭代?

1 个答案:

答案 0 :(得分:3)

让我们看一下每个元素的公式,结果是将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几乎不会花费什么:它们都使用相同的数据缓冲区。