如何在numpy中对多个矩阵乘法进行矢量化?

时间:2017-11-18 19:10:51

标签: python numpy vectorization

对于我的意思的概念性概念,我有2个数据点:

x_0 = np.array([0.6, 1.4])[:, None]
x_1 = np.array([2.6, 3.4])[:, None]

和2x2矩阵:

y = np.array([[2, 2], [2, 2]])

如果我执行x_0.T @ y @ x_0,我会获得array([[ 8.]])。同样,x_1.T @ y @ x_1会返回array([[ 72.]])

但是有没有办法在没有for循环的情况下一次执行这两个计算?显然,这里的加速可以忽略不计,但我正在使用比此处提供的更多的数据点。

2 个答案:

答案 0 :(得分:3)

AX = 0 AY = 0 AR = 1 BX = 4 BY = 3 BR = 2 D = (4, 3) Length(D) = 5 dx = 4/5 dy = 3/5 sx = 0.8 sy = 0.6 ex = 4 - 2 * 4/5 = 12/5 = 2.4 ey = 3 - 2 * 3/5 = 9/5 = 1.8 作为xx_0等列的堆叠版本,我们可以使用np.einsum -

x_1

混合使用np.einsum('ji,jk,ki->i',x,y,x) np.einsum -

matrix-multiplcation

如前所述,np.einsum('ij,ji->i',x.T.dot(y),x) 被假定为列堆叠,如下所示:

x

运行时测试 -

x = np.column_stack((x_0, x_1))

答案 1 :(得分:0)

基本上,您希望对您拥有的所有var doc = XDocument.Parse(yourXml); float[] x = ((IEnumerable)doc.XPathEvaluate("//@x")) .OfType<XAttribute>() .Select(c => float.Parse(c.Value, CultureInfo.InvariantCulture)) .ToArray(); 执行(x.T).dot(A).dot(x)操作。

x

考虑它的简单方法是对x_0 = np.array([0.6, 1.4])[:, None] x_1 = np.array([2.6, 3.4])[:, None] x = np.hstack((x_0, x_1)) # [[ 0.6 2.6], [ 1.4 3.4]] 所有x_i进行乘法运算

y

但当然这不太有效。但是,你可以做到这一点,你可以先用[x_i.dot(y).dot(x_i) for x_i in x.T] >> [8.0, 72.0] x做点积,然后再乘以自身并加总列,即手动做点积。这将使计算更快:

y

注意我首先转置矩阵,因为我们希望将x = x.T (x.dot(y) * x).sum(axis=1) >> array([ 8., 72.]) 的列乘以y的每一行