如何将np.dot(vector_a, vector_b[:,i])向量化处理,以适用于i的范围?

3

我有一个形状为(3,1)的numpy数组“vector_a”。如果我用一个形状为(1,3)的向量“vector_b”与它相乘,我会得到一个形状为(3,3)的结果。

现在,“vector_b”实际上是一个列向量的numpy数组,形状为(3,N)。我想将这些列向量中的每一个都与“vector_a”相乘,以产生N个形状为(3,3)的矩阵,结果形状为(N,3,3)。

我已经进行了以下操作:

r = np.dot(vector_a.reshape(1,3,1), vector_b.T.reshape(N, 1, 3))

我本来期望r的形状是(N,3,3),但实际得到的形状为(1,3,64,3)???我不知道为什么会出现这种情况。vector_a和vector_b都是C连续的。在进行vector_b.T.reshape(N, 1, 3)之前,我尝试将vector_b转换为F连续,但我仍然得到相同的r形状(1,3,64,3)。

有人知道如何编写正确的表达式吗?


1
“dot” 对于大于二维的数组有什么说法? - hpaulj
谢谢,我没有读过那个。但是我仍然无法让它工作... - martinako
这确实不是一个“点”情况。einsum表达式没有求和任何东西。它可以通过简单的乘法(和广播)b.T[:,:,None] * a.T[None,:,:]来完成。 - hpaulj
2个回答

4

作为替代方案,如果您使用einsum,您可以避免重新调整数组大小来进行点乘:

np.einsum('ij,jk->kij', vector_a, vector_b)

我仍然需要完全理解einsum,但这个方法可行!谢谢 - martinako
1
没问题!einsum非常有用 - 这里有各种答案解释它(包括我写的一个;-))。 - Alex Riley

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接