我目前有两个数组,形状为v1=(3000,3)和v2=(3,23000)。3000是一个时间维度,因此v1有3000(1,3)个样本,v2有3000(3,2)个样本。我希望做矩阵乘法和广播沿3000维,这样我得到3000(1,2)向量作为回报。你知道吗
我尝试过重塑,使v1=(1,33000)和v2=(3,2300),这会给出一个错误,表示形状没有对齐。你知道吗
代码:
v1 = np.ones((1,3,3000)) +1
v2 = np.ones((3,2,3000)) - 0.5
np.dot(v1,v2)
Tags:
我建议您不要使用
optimize=True
标志,因为它是高效的,出于一些奇怪的原因。另外,如果最终需要一个2D数组作为最终结果,我建议您显式地将2D数组提升到3D,执行批处理矩阵乘法,然后压缩结果数组的单例维数。请查找以下代码:因此,从上面的计时可以看出,不使用
optimize=True
标志可以获得大约2倍的加速比。另外,显式地将数组整形为3D可以更好地理解使用numpy.einsum()
时发生的事情。你知道吗注意:计时是使用最新的NumPy版本
'1.16.1'
请阅读更多关于Understanding NumPy einsum()
由于} -
v1
的形状(3000,3)
和v2
的形状(3,2,3000)
,我们可以使用^{这给了我们一个shape
(3000,2)
的输出。你知道吗我们可以在
np.einsum
中使用optimize
arg。使用optimize = True
,它在内部利用BLAS
,使用optimize = False
求助于简单的C循环。这种BLAS
方式也需要一些设置工作。因此,对于经过求和缩减的轴的适当长度,我们可能希望将该标志设置为True
或False
。在本例中,这些轴似乎很短,因此我们最好使用默认的:optimize = False
输入。你知道吗相关问题 更多 >
编程相关推荐