numpy - 使用 `np.tensordot` 或仅二维 `np.dot` 获取 `np.dot` 的 ND 行为
问题描述
我试图表达仅np.dot
使用2-D或.np.dot
np.tensordot
回顾一下,np.dot
对 ND 执行以下操作:它沿除最后两个维度之外的所有维度匹配/广播数组,并对所有维度执行点积。例如,如果x.shape
是(2, 3, 4, 5)
和y.shape
是(2, 3, 5, 4)
,np.dot(x, y).shape
是(2, 3, 4, 4)
和np.dot(x, y)[i, j]
是np.dot(x[i, j], y[i, j])
。
此外,如果x.shape
is just (4, 5)
,它将首先转换为(2, 3, 5, 4)
via np.broadcast
。
我试过np.tensortdot(x, y, axes=(-1, -2))
了,但它沿着 的每个维度重复x
,y
而不是匹配它们。
我意识到我可以写一个循环,但我正在寻找一个矢量化的解决方案。
解决方案
你得到了np.dot
错误的广播行为:
In [254]: x=np.ones((2,3,4,5)); y=np.ones((2,3,5,4))
In [255]: np.dot(x,y).shape
Out[255]: (2, 3, 4, 2, 3, 4)
In [256]: np.matmul(x,y).shape
Out[256]: (2, 3, 4, 4)
对于 (4,5) x
:
In [257]: np.dot(x[0,0],y).shape
Out[257]: (4, 2, 3, 4)
In [258]: np.matmul(x[0,0],y).shape
Out[258]: (2, 3, 4, 4)
matmul
之所以添加,正是因为np.dot
它不像np.dot(x[i,j,:,:], y[i,j,:,:])
为所有人表演i,j
。
中的形状Out[255]
是x
减 5 的形状,加上减 5 的形状。y
实际上是所有东西的外部产物,总和在大小 5 维度上。
tensordot
使用np.dot
. 它只是重塑和转置输入以将问题简化为二维问题dot
。然后它将结果按摩回所需的形状和顺序。
In [259]: np.tensordot(x, y, axes=(-1,-2)).shape
Out[259]: (2, 3, 4, 2, 3, 4) # cf Out[255]
In [261]: np.einsum('ijkl,ijlm->ijkm',x,y).shape
Out[261]: (2, 3, 4, 4) # cf Out[256]
由于稀疏矩阵是 2d 开始 - 和结束,我不明白你的问题。如果您有多个稀疏矩阵,则必须单独使用它们。
推荐阅读
- c# - 从选定节点中选择返回数据所有xml
- arrays - 如何在数组中找到增量?
- c++ - 如何编写嵌套的for循环
- c# - 如何使用 .NET SDK 从 vCenter VMWare 检索虚拟机标签
- c# - .Net Core 2.1 缓存标签助手
- python - 使用 SQLAlchemy (Python) 创建模型对象时生成 GUID
- go - 创建需要其他可重复逻辑作为先决条件的函数(干净的代码)
- python-3.x - pycparser解析多字节字符错误
- php - 获取与 Woocommerce 中产品类别相关的所有属性及其术语
- javascript - 如何在没有 JSON.stringify 的情况下使用 JavaScript 将对象转换为字符串?