对于我的意思的概念性概念,我有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循环的情况下一次执行这两个计算?显然,这里的加速可以忽略不计,但我正在使用比此处提供的更多的数据点。
答案 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
作为x
,x_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
的每一行