回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>矩阵/向量乘法看起来是这样的,工作正常:</p>
<pre><code>A = np.array([[1, 0],
[0,1]]) # matrix
u = np.array([[3],[9]]) # column vector
U = np.dot(A,u) # U = A*u
U
</code></pre>
<p><strong>如果元素<code>Xx,Xy,Yx,Yy, u,v</code>都是二维或三维数组,有没有办法保持相同的结构?</strong></p>
<pre><code>A = np.array([[Xx, Xy],
[Yx,Yy]])
u = np.array([[u],[v]])
U = np.dot(A,u)
</code></pre>
<p>理想的结果是这样的,而且效果很好(因此我的问题的答案是“很高兴拥有”</em>):</p>
<pre><code>U = Xx*u + Xy*v
V = Yx*u + Yy*v
</code></pre>
<h2>成功故事</h2>
<p>THX到<code>@loopy walt</code>和<code>@Ivan</code></p>
<p><strong>1。它可以工作:</strong>
<code>np.einsum('ijmn,jkmn->ikmn', A, w)</code>和<code>(w.T@A.T).T</code>都再现了正确的逆变坐标变换。
<a href="https://i.stack.imgur.com/SOp9h.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/SOp9h.png" alt="enter image description here"/></a></p>
<p><strong>2。次要问题:</strong>
<code>np.einsum('ijmn,jkmn->ikmn', A, w)</code>和<code>(w.T@A.T).T</code>都返回一个带有一对方括号的数组太多(它应该是二维的)。请参见@Ivan的答案为什么:</p>
<pre><code>array([[[ 0, 50, 200],
[ 450, 800, 1250],
[1800, 2450, 3200]]])
</code></pre>
<p><strong>3。要优化:</strong>构建块矩阵非常耗时:</p>
<pre><code>A = np.array([[Xx, Xy],
[Yx,Yy]])
w = np.array([[u],[v]])
</code></pre>
<p>所以总的返回时间是<code>np.einsum('ijmn,jkmn->ikmn', A, w)</code>和<code>(w.T@A.T).T</code>更大的。也许这是可以优化的</p>
<pre><code>- p_einstein np.einsum('ijmn,jkmn->ikmn', A, w) 9.07 µs ± 267 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
- p_tensor: (w.T@A.T).T 7.89 µs ± 225 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
- p_vect: [Xx*u1 + Xy*v1, Yx*u1 + Yy*v1] 2.63 µs ± 173 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
- p_vect: including A = np.array([[Xx, Xy],[Yx,Yy]]) 7.66 µs ± 290 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
</code></pre>