Python 在像gufunc这样的签名中,问号的确切含义是什么?

Python 在像gufunc这样的签名中,问号的确切含义是什么?,python,numpy,numpy-einsum,numpy-ufunc,Python,Numpy,Numpy Einsum,Numpy Ufunc,例如: 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

例如:

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)
np.arange(3)@np.arange(2)
#回溯(最近一次呼叫最后一次):
#文件“”,第1行,在
#ValueError:matmul:输入操作数1的核心维度0与gufunc签名(n?,k),(k,m?)->(n?,m?)不匹配(大小2与3不同)

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

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

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

引用

  • 可能缺少维度。这一部分几乎完全是为了将
    matmul
    包装成一个gufunc
    matmul
    代表矩阵乘法,如果它仅代表矩阵乘法,则可以用签名
    (m,n),(n,p)->(m,p)
    覆盖它。但是,当维度缺失时,它有一些特殊情况,允许将任一参数视为单个向量,从而使函数有效地成为向量矩阵、矩阵向量或向量向量乘法(但没有广播)。为了支持这一点,建议允许使用问号对维度名称进行后期固定,以表明该维度不一定存在

    通过此添加,
    matmul
    的签名可以表示为
    (m?,n),(n,p?)->(m?,p?
    。这表明,例如,如果第二个操作数只有一个维度,就初等函数而言,它将被视为输入具有核形状
    (n,1)
    ,输出具有相应的核形状
    (m,1)
    。但是,实际的输出数组已删除了灵活的维度,即它将具有形状
    (…,m)
    。类似地,如果两个参数只有一个维度,则输入将显示为对初等函数具有形状
    (1,n)
    (n,1)
    ,输出为
    (1,1)
    ,而实际返回的输出数组将具有形状
    ()
    。这样,签名允许对四个相关但不同的签名使用单个基本函数,
    (m,n)、(n,p)->(m,p)
    (n)、(n,p)->(p)
    (m,n)、(n)->(m)
    (n)、(n)->(