【问题标题】:What is the precise meaning of question marks in an einsum-like gufunc signature?类似 einsum 的 gufunc 签名中问号的确切含义是什么?
【发布时间】:2020-04-09 03:59:42
【问题描述】:

例如:

np.arange(3)@np.arange(2)
# Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
# ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 3)

请注意:我知道出了什么问题以及错误消息的含义。我只是对精确的语法感兴趣。问号代表什么?

【问题讨论】:

    标签: python numpy numpy-einsum numpy-ufunc


    【解决方案1】:

    这些表示允许缺失的维度。如果缺少这样的维度,它将被视为存在长度为 1 的维度,但相应的维度将从输出中删除。

    在matmul签名(n?,k),(k,m?)-&gt;(n?,m?)中,第一个参数的第一个维度和第二个参数的第二个维度都允许缺失。如果是,则第一个参数将被视为行向量,第二个参数将被视为列向量。

    引用NEP 20 — Expansion of Generalized Universal Function Signatures

    1. 可能缺少尺寸。这部分几乎完全是由将matmul 包装在 gufunc 中的愿望驱动的。 matmul 代表矩阵乘法,如果它只这样做,它可以被签名 (m,n),(n,p)-&gt;(m,p) 覆盖。但是,它在缺少维度时有特殊情况,允许将任一参数视为单个向量,因此该函数有效地变为向量矩阵、矩阵向量或向量向量乘法(但没有广播)。为了支持这一点,建议允许在维度名称后加上问号,以表明维度不一定必须存在。

      通过这个添加,matmul 的签名可以表示为(m?,n),(n,p?)-&gt;(m?,p?)。这表明,例如,如果第二个操作数只有一维,则对于基本函数而言,它将被视为该输入具有核心形状 (n, 1),而输出具有相应的核心形状 (m, 1)。然而,实际的输出数组删除了灵活维度,即它的形状为(..., m)。类似地,如果两个参数只有一个维度,则输入将显示为具有形状 (1, n)(n, 1) 到基本函数,输出为 (1, 1),而返回的实际输出数组将具有形状 @987654334 @。通过这种方式,签名允许对四个相关但不同的签名使用单个基本函数,(m,n),(n,p)-&gt;(m,p)(n),(n,p)-&gt;(p)(m,n),(n)-&gt;(m)(n),(n)-&gt;()

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2016-03-12
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2017-04-19
      • 2011-05-06
      相关资源
      最近更新 更多